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?