我使用以下两个步骤来计算签名,为什么使用java代码会有所不同
1- Signature s1 = Signature.getInstance("MD5withRSA");
// some code
String b1 = base64Encode(doFinalData);
2- byte[] md5 = MD5.md5("data content");
byte[] rsa = RSA.rsa(md5);
String b2 = base64Encode(rsa);
// Why b1 and b2 are not equal是我的理解错了,还是代码错了
发布于 2021-03-10 06:50:52
我不确定你在#2中使用的是哪个库,但它看起来像原始的RSA加密。
当您在#1中执行"MD5withRSA"时,您实际上将使用PKCS#1 v1.5 padding for signature generation。这将创建一个指定MD5算法和MD5签名值的结构。然后它将填充它,最后它将使用私钥执行模幂运算。标准中对这些步骤进行了详细描述。
但是,如果#2只是原始RSA,那么它将简单地将MD5转换为正整数,并将其用作模幂运算的输入。因此,缺少MD5散列之前的填充和结构。
只需补充一点:使用RSAV1.5和原始PKCS#1的签名方案是确定性的。这并不是所有方案都具有的属性: RSA-PSS或ECDSA将始终生成不同的签名值。因此,要测试签名是否有效,必须使用公钥而不是二进制比较来执行签名验证。
https://stackoverflow.com/questions/66553895
复制相似问题