从XML签名值

时间:2017-12-28 19:59:12

标签: java rsa digital-signature xml-signature rsa-sha256

我需要有人帮助我理解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"/>

1 个答案:

答案 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