2016-11-05 28 views
14

Trước hết tôi phải nói kiến ​​thức của mình khi sử dụng toán Sage thực sự rất hạn chế, nhưng tôi thực sự muốn cải thiện để có thể giải quyết những vấn đề này mà tôi đang gặp phải. Tôi đã được yêu cầu để thực hiện những điều sau:Thực hiện RDSA trên sage

1 - Đọc trong FIPS 186-4 (http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf) định nghĩa của ECDSA và triển khai sử dụng Sage toán với:

(a) prime eliptic curves (P-xxx) 

    (b) binary eliptic curves (B-xxx) 

Tôi đã cố gắng giải quyết (a) bằng cách xem trên internet rất nhiều và kết thúc với đoạn mã sau:

Bài tập 1, một)

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())) 

Nhưng bây giờ tôi tự hỏi, Mã này thực sự là những gì tôi đã được yêu cầu?

Ý tôi là, tôi nhận được các giá trị cho p và tất cả các giá trị đó từ liên kết được đề cập ở trên.

Nhưng đây có phải là eliptic curve Tôi đã thực hiện một bước chính? (bất cứ điều gì thực sự có nghĩa).

Trong các từ thứ tự là mã này tôi dán cùng câu trả lời? Và chức năng đột biến thực sự đang làm gì? Tôi hiểu phần còn lại nhưng không thấy lý do tại sao cần phải ở đây ...

Ngoài ra, tôi có thể làm gì với câu hỏi (b)? Tôi đã xem xét tất cả trên internet nhưng tôi không thể tìm thấy một đề cập dễ hiểu về đường cong eliptic nhị phân trong hiền ...

Tôi có thể sử dụng lại mã trên và chỉ cần thay đổi tạo đường cong để nhận câu trả lời?

Trả lời

0

(a.) Mã này có thực sự là những gì tôi đã được yêu cầu không?

số

Phương pháp dấu() có chữ ký sai: nó không chấp nhận một cuộc tranh cãi ký.

Sẽ rất hữu ích khi viết các bài kiểm tra đơn vị cho mã của bạn dựa trên các vectơ thử nghiệm đã xuất bản, có thể là these, xem câu hỏi Secp256k1 ECDSA test examples này.

Bạn có thể xem xét thực hiện các xác minh được mô tả trong D.5 & D.6 (trang 109 ff).

(b.) Đường cong elliptic nhị phân

Các FIPS ấn phẩm bạn trích dẫn cung cấp một số lời khuyên về việc thực hiện đường cong như vậy, và có bạn có thể tận dụng mã hiện tại của bạn. Nhưng có lẽ lợi thế thực tế ít hơn để thực hiện chúng, so với các đường cong P-xxx, vì sức mạnh của đường cong B-xxx là trên nền tảng rockier. Chúng có lợi thế cho việc triển khai phần cứng như FPGA, nhưng điều đó không liên quan đến tình huống của bạn.

Các vấn đề liên quan