我需要有人帮助我理解 XML 数字签名方法 rsa-sha1。我认为签名值= RSA-encrypt(sha1(signedInfo), privatekey)。
注意 Base64.encode(sha1(signedInfo)) 包含 28 个字符。所以我认为 Base64.encode(RSA-decrypt(signaturevalue), publickey) 也应该返回 28 个字符。然而,我实际上得到了一个 48 个字符的字符串。
Base64 base64 = new Base64();
byte[] encrypted = base64.decode(signatureValue);
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, getX509Cert().getPublicKey());
byte[] cipherText = cipher.doFinal(encrypted);
System.out.println(base64.encodeToString(cipherText));
//print out MCEwCQYFKw4DAhoFAAQU0G+7jFPydS/sWGO1QPjB0v3XTz4=
//which contains 48 characters.
}
catch (Exception ex){
ex.printStackTrace();
}
XML 文件中指示的签名方法
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
最佳答案
RSA 签名实际上与使用私钥加密不同,但 JCE 通过允许 RSA 的 Cipher 中的“向后”操作(仅限)来促进此错误,该操作实际上执行 PKCS1-v1_5 签名,并且恢复而不是按照其设计目的进行加密和解密。
对于 PKCS1 到 v1.5 中的原始标准化 RSA 签名方案(现在改名为 RSASSA-PKCS1-v1_5),该值被填充(使用“类型”01 多个 FF 和一个 00)并用私钥进行 modexp'ed 不仅仅是哈希值,而且是包含哈希值的 ASN.1 结构。请参阅 section 9.2 of rfc8017 中的编码操作 EMSA-PKCS1-v1_5或 rfc3447 或 rfc2437 中的 9.2.1,尤其是步骤 2 和(对于较新的两个版本)“注释”项 1。
欺骗Using SHA1 and RSA with java.security.Signature vs. MessageDigest and Cipher
和 Separate digest & signing using java security provider
关于java - 从 XML 签名值获取 sha1 哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48013643/