2017-04-09 87 views
0

我注意到,如果我使用ECDsa.SignData方法,我总是会得到不同的ECDSA签名。ECDSA签名 - 是否可以使用已用密钥的结论?

所以我不知道是否有可能从ECDSA签名到已用密钥的结论?

如果Alice向Bob1和Bob2发送消息,Eve可以在没有来自Alice的公众的情况下确定该签名来自同一个发送者?

public static byte[] SignData(KeyPair privateKeyPair, byte[] data) 
{ 
    var ecDsa = ECDsa.Create(ECCurve.NamedCurves.brainpoolP320r1); 
    ecDsa.ImportParameters(privateKeyPair.CreateECParameters()); 
    return ecDsa.SignData(data, HashAlgorithmName.SHA512); 
} 

public static bool VerifyData(KeyPair signedKeyPair, byte[] data, byte[] signature) 
{ 
    var ecDsa = ECDsa.Create(ECCurve.NamedCurves.brainpoolP320r1); 
    ecDsa.ImportParameters(signedKeyPair.CreateECParameters()); 
    return ecDsa.VerifyData(data,signature, HashAlgorithmName.SHA512); 
} 

var plainMsg = Encoding.UTF8.GetBytes("Hello World"); 
var keyPair = BrainpoolKeyGenerator.CreateKeyPair(true); 

var signature1 = SignData(keyPair, plainMsg); 
var signature2 = SignData(keyPair, plainMsg); 

Assert.That(signature1,Is.Not.EquivalentTo(signature2), "Signature #1 and #2 are NOT equal"); 

Assert.That(VerifyData(keyPair.ExportPublicKey(), plainMsg, signature1), "Signature of #1 is valid"); 
Assert.That(VerifyData(keyPair.ExportPublicKey(), plainMsg, signature2), "Signature of #2 is valid"); 

回答

1

不,在相同的数据上有两个ECDSA签名并不能揭示它是由同一方签署了两次还是两次。

为了谈ECDSA是如何工作的,我们需要一些快速的(松散的定义)方面:

  • G,发电机,是曲线上的点。
    • 与曲线的私钥(d)关联的公钥是d * G,使用曲线数学我们不会在这里讨论。
    • 对于brainpoolP320r1,G值分解为xyRFC5639, section 3.5
  • n,曲线命令,是给出Gd最大的法律价值。
    • RFC5639将此值称为q,但大多数情况下都称为n

有ECDSA的上Wikipedia击穿,但公式的主旨是:

  • 创建的随机数k使得0 < k < n
  • r等于X的整数EC点的坐标点k * G
  • z被解释为数字的消息摘要h一些修整/延伸)
  • kInvkn(也请参阅Extended Euclidean Algorithm)的倒数。
  • skInv * (z + (r * d)) mod n
  • 签名是(rs)。
    • 在.NET中,(r,s)值以IEEE P1363格式表示,这意味着前半部分是r,后半部分是s,它们的长度由曲线决定。

所以,签名上半年实际上是一个随机数。椭圆曲线密码是基于这样的事实,即很难计算Q/G(其中Q是公钥,也就是曲线上的点),所以从r恢复k是困难的。

签名的后半部分(s)是涉及签名人密钥的唯一部分,但它被k打了很多次。

签名验证算法然后检查是否Qz'(验证者的版本的z)中,用rs相结合,使一个式平衡。如果没有,则没有迹象表明是否因为散列/摘要错误或公钥错误。