ser*_*0ne 6 c# cryptography signing rsa ecdsa
考虑以下使用 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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a71877 4c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a718774c572bd8a25 adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89
现在考虑相同的代码,除了使用 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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 a31fe9656fc8d3a459e623dc8204e6d0268f8df56d734dac3ca3262edb5db883 a871c47a7 f48a12b38a994e48a9659fab5d6376f3dbce37559bcb617efe8662d d7ef0a04f3c8055644677299a9414a75adcb15916eb48417416c9317ace2ff4f 779f5dd63960abda52a 7da70464b92eedd47f84a8dffda2d672e6a99de1bab95
RSA 的签名输出是我所期望的;ECDSA,我没有。为什么 ECDSA 会为相同的数据生成不同的签名?
椭圆曲线数字签名算法(ECDSA) 是经典 DSA 算法的改编版,依赖于加密安全的随机数生成器。例如:ECDSA 签名算法计算消息的哈希值,然后生成随机整数k并计算签名(一对整数 { R, S} )。R由 计算得出k,并S使用消息哈希 + 私钥 + 随机数计算得出k。因此,由于随机性,签名是不确定的。
您可以在此处尝试椭圆曲线。
ECDSA 的签名由R和的组合组成S,其中R是一个取决于随机参数的值k,该随机参数又被输入到 ECDSA 算法中。S反过来又取决于该值。如果R是静态值,那么攻击者就可以计算私钥(!)。
使用 PKCS#1 v1.5 填充的签名生成是确定性的这一事实使其显得很奇怪。实际上,具有 PSS 填充的 RSA 是使用显式盐进行随机化的,因此确定性行为与 RSA 没有任何关系;您甚至可以说这是一个不需要的属性,因为它确实会向验证者以外的其他方公开有关已签名的消息/数据的信息。
但是,如果需要,可以k 使用基于消息本身和私钥的确定性方案进行计算。这在特定协议中可能有一些优点;例如,这意味着不需要存在随机数生成器。一般推荐使用非确定性/随机版本的 ECDSA。
最后,证据就在布丁中:如果公钥验证成功,那么您的签名生成过程符合规范。为了使该方案安全,除了其他要求之外,公钥当然必须经过验证和信任。
| 归档时间: |
|
| 查看次数: |
2678 次 |
| 最近记录: |