2016-11-05 4 views
14

まず、セージの数学を使って私の知識は本当に限られていますが、私は本当に私が持っているこれらの問題を解決できるように改善したいと思います。私は(a)はを解決しようとしたセージのRDSA実装

(a) prime eliptic curves (P-xxx) 

    (b) binary eliptic curves (B-xxx) 

:FIPS 186から4で読む(http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdfは)ECDSAの定義としてセージの数学を使用して実装する -

1:私は、次のことを実施するよう依頼されましたインターネットを中心に多くのことを見ていることで、次のコードになってしまった:

演習1、A)

class ECDSA_a: 

def __init__(self): 
    #Parameters for Curve p-256 as stated on FIPS 186-4 D1.2.3 
    p256 = 115792089210356248762697446949407573530086143415290314195533631308867097853951 
    a256 = p256 - 3 
    b256 = ZZ("5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", 16) 
    ## base point values 
    gx = ZZ("6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", 16) 
    gy = ZZ("4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", 16) 

    self.F = GF(p256) 
    self.C = EllipticCurve ([self.F(a256), self.F(b256)]) 
    self.G = self.C(self.F(gx), self.F(gy)) 

    self.N = FiniteField (self.C.order()) # how many points are in our curve 

    self.d = int(self.F.random_element()) # privateKey 
    self.pd = self.G*self.d    # our pubkey 
    self.e = int(self.N.random_element()) # our message 

#sign 
def sign(self): 
    self.k = self.N.random_element() 
    self.r = (int(self.k)*self.G).xy()[0] 
    self.s = (1/self.k)*(self.e+self.N(self.r)*self.d) 

#verify 
def verify(self): 
    self.w = 1/self.N(self.s) 
    return self.r == (int(self.w*self.e)*self.G + int(self.N(self.r)*self.w)*self.pd).xy()[0] 

#mutate 
def mutate(self): 
    s2 = self.N(self.s)*self.N(-1) 
    if not (s2 != self.s) : return False 
    self.w = 1/s2 
    return self.r == (int(self.w*self.e)*self.G + int(self.N(self.r)*self.w)*self.pd).xy()[0] # sign flip mutant 

#TESTING 
#Exercise 1 a) 
print("Exercise 1 a)\n") 

print("Elliptic Curve defined by y^2 = x^3 -3x +b256*(mod p256)\n") 
E = ECDSA_a() 
E.sign() 
print("Verify signature = {}".format(E.verify())) 
print("Mutating   = {}".format(E.mutate())) 

しかし、今私は疑問に思う、このコードは本当に私が求められているものですか?

つまり、pの値と上記のリンクからの値が得られました。

しかしこれはeliptic curve私はプライムワンを作ったのですか? (それが本当に何を意味するものであれ)。

言い換えれば、このコードは私が答えをまとめたものですか?実際にmutate関数は何をしていますか?私は残りを理解していますが、なぜここに来る必要があるのか​​分かりません...

また、質問(b)について私は何ができますか?私はインターネットの周りすべてを見ているが、私はセージのバイナリエリプティックカーブについての理解できる言葉を見つけることができません...

私はちょうど上記のコードを再利用し、単に答えを得るために曲線の作成を変更できますか?

答えて

0

(a)このコードは本当に私が求めているものですか?

記号()メソッドは、間違った署名を有する:それは署名する引数を受け付けません。

theseという恐らくSecp256k1 ECDSA test examplesという質問を発行したテストベクタに基づいて、コードの単体テストを書くことは非常に役に立ちます。

D.5 & D.6(pp 109ff)に記載されている検証を行うことを検討することもできます。

(B。)バイナリ楕円曲線

あなたが引用したFIPSの出版物は、このような曲線を実装する上でいくつかのアドバイスを提供しています、はい、あなたはあなたの現在のコードを活用することができます。しかし、B-xxxカーブの強さがロッキーの立場にあるため、P-xxxカーブと比較して、それらを実装するのはおそらく実用上有利ではありません。 FPGAなどのハードウェア実装に利点がありますが、それはあなたの状況には関係ありません。