我需要有人帮助我理解XML数字签名方法 rsa-sha1 。我想签名值= RSA-encrypt(sha1(signedInfo),私钥)。
注意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"/>
答案 0 :(得分:2)
RSA签名实际上与使用私钥加密并不相同,但JCE通过允许“倒退”来推销此错误。 Cipher
中仅用于RSA的操作,它实际上执行PKCS1-v1_5签名和恢复,而不是设计用于加密和解密。
对于PKCS1到v1.5中的原始标准化RSA签名方案,现在重新索引RSASSA-PKCS1-v1_5,填充的值(使用&#39;类型&#39; 01多个FF和一个00)和modexp&# 39;带有私钥的ed 不仅仅是哈希,而是包含哈希的ASN.1结构。请参阅section 9.2 of rfc8017中的编码操作EMSA-PKCS1-v1_5或rfc2437中的rfc3447或9.2.1,尤其是步骤2和(对于较新的两个版本)&#39;注意&#39;第1项。
Dupe Using SHA1 and RSA with java.security.Signature vs. MessageDigest and Cipher
和Separate digest & signing using java security provider