考虑以下使用 RSA 的代码...
Example:
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);
}
Output:
043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89
043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89
043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89
043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89
043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89
现在考虑相同的代码,除了使用 ECDSA...
Example:
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);
}
Output:
043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89
a31fe9656fc8d3a459e623dc8204e6d0268f8df56d734dac3ca3262edb5db883
a871c47a7f48a12b38a994e48a9659fab5d6376f3dbce37559bcb617efe8662d
d7ef0a04f3c8055644677299a9414a75adcb15916eb48417416c9317ace2ff4f
779f5dd63960abda52a7da70464b92eedd47f84a8dffda2d672e6a99de1bab95
我期望的 RSA 签名输出; ECDSA,我没有。为什么 ECDSA 会为相同的数据生成不同的签名?
椭圆曲线数字签名算法(ECDSA)是经典 DSA 算法的改编版,依赖于加密安全随机数发生器。例如:ECDSA签名算法计算消息的哈希值,然后生成一个随机整数k
并计算签名(一对整数{R
, S
} ). R
计算自k
, and S
使用消息哈希+私钥+随机数计算k
。所以,签名是不确定性由于随机性。
您可以尝试椭圆曲线here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)