为什么ECDSA对于相同的数据会产生不同的签名,而RSA则不会?

6
考虑以下使用RSA的代码...
例子:
byte[] raw = Encoding.Default.GetBytes("Hello, World!");
RSA key = RSA.Create();

for (int index = 0; index < 5; index++)
{
    byte[] signed = key.SignData(raw, HashAlgorithmType.SHA256, RSASignaturePadding.Pkcs1);
    string hashed = signed.ToSha256String();
    Console.WriteLine(hashed);
}

输出结果:

043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89

现在考虑相同的代码,但使用ECDSA...

示例:

byte[] raw = Encoding.Default.GetBytes("Hello, World!");
ECDsa key = ECDsa.Create();

for (int index = 0; index < 5; index++)
{
    byte[] signed = key.SignData(raw, HashAlgorithmType.SHA256);
    string hashed = signed.ToSha256String();
    Console.WriteLine(hashed);
}

输出:

043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 a31fe9656fc8d3a459e623dc8204e6d0268f8df56d734dac3ca3262edb5db883 a871c47a7f48a12b38a994e48a9659fab5d6376f3dbce37559bcb617efe8662d d7ef0a04f3c8055644677299a9414a75adcb15916eb48417416c9317ace2ff4f 779f5dd63960abda52a7da70464b92eedd47f84a8dffda2d672e6a99de1bab95

RSA的签名输出与预期一致,但ECDSA的签名却不同。为什么相同数据的ECDSA签名会产生不同结果?


3
采用PKCS#1 v1.5填充的RSA是确定性的,即使用相同的输入参数会生成相同的签名。但如果使用PSS填充,则不是这种情况。ECDSA通常不是确定性的,即对于相同的输入参数会生成不同的签名。然而,还有一种确定性变体的ECDSA,在.NET中不支持它,但可以通过C#/BouncyCastle来实现,例如此处 - Topaco
在 @Topaco 的基础上,如果您想要椭圆曲线上的确定性签名,请使用 EdDSA。 - Woodstock
2个回答

7

椭圆曲线数字签名算法(ECDSA)是经典DSA算法的一种改进,依赖于密码学安全的随机数生成器。例如:ECDSA签名算法计算消息的哈希值,然后生成一个随机整数k并计算签名(一对整数{RS})。Rk计算得出,而S使用消息哈希值+私钥+随机数k计算得出。因此,由于有随机性,签名是非确定性的

您可以在这里尝试使用椭圆曲线。


5
ECDSA的签名由RS组成,其中R是依赖于随机参数k的值,该值又被输入到ECDSA算法中。而S则依赖于该值。如果R是静态值,则会允许攻击者计算出私钥(!)
PKCS#1 v1.5填充的签名生成方式是确定性的,这使得它与众不同。实际上,使用PSS填充的RSA是使用显式盐进行随机化的,因此确定性行为与RSA无关;你甚至可以说这是一种不希望的属性,因为它会向验证者以外的其他方暴露已签名的消息/数据的信息。

如果必须的话,可以使用基于消息本身和私钥的确定性方案计算k,但这可能在某些特定协议中有一些优势;例如,这意味着不需要存在随机数生成器。通常建议使用非确定性/随机版本的ECDSA。

最终,实践出真知:如果使用公钥进行验证成功,则您的签名生成过程符合规范。当然,为了使方案安全,公钥必须通过验证并受信任,还需满足其他要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接