【发布时间】:2021-08-27 21:36:43
【问题描述】:
考虑以下使用 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 会为相同的数据生成不同的签名?
【问题讨论】:
-
带有 PKCs#1 v1.5 填充的 RSA 是确定性的,即使用相同的输入参数生成相同的签名。如果您使用 PSS 作为填充,则情况并非如此。 ECDSA 通常不是确定性的,即为相同的输入参数生成不同的签名。但是,ECDSA 还有一个确定性变体,.NET 不支持开箱即用,但 C#/BouncyCastle 不支持,参见例如here.
-
以@Topaco 的观点为基础,如果您想要椭圆曲线上的确定性签名,请使用 EdDSA。
标签: c# cryptography rsa signing ecdsa