【问题标题】:RDSA implementation on sageSage 上的 RDSA 实施
【发布时间】:2017-03-18 23:31:34
【问题描述】:

首先我必须说我使用 Sage 数学的知识非常有限,但我真的很想改进以能够解决我遇到的这些问题。我被要求执行以下操作:

1 - 阅读 FIPS 186-4 (http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf) 的 ECDSA 定义并使用 Sage 数学实现:

  (a) prime eliptic curves (P-xxx)

  (b) binary eliptic curves (B-xxx)

我尝试通过大量浏览互联网来解决 (a) 并最终得到以下代码:

练习 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),我该怎么办?我浏览了整个互联网,但找不到一个可以理解的关于 sage 中的二元椭圆曲线的提及...

我可以重复使用上面的代码并简单地更改曲线创建来得到答案吗?

【问题讨论】:

    标签: python cryptography sage elliptic-curve ecdsa


    【解决方案1】:

    (a.) 这段代码真的是我被要求的吗?

    没有。

    sign() 方法的签名错误:它不接受要签名的参数。

    根据已发布的测试向量(可能是these)为您的代码编写单元测试会非常有帮助,请参阅此Secp256k1 ECDSA test examples 问题。

    您可以考虑使用 D.5 和 D.6 (pp 109 ff) 中描述的验证方法。

    (b.) 二元椭圆曲线

    您引用的 FIPS 出版物提供了一些关于实现此类曲线的建议,是的,您可以利用您当前的代码。但与 P-xxx 曲线相比,实施它们的实际优势可能较小,因为 B-xxx 曲线的强度更不稳定。它们对于 FPGA 等硬件实现具有优势,但这与您的情况无关。

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2017-09-18
      • 2021-12-19
      相关资源
      最近更新 更多