RSA java签名验证失败

RSA java签名验证失败,java,rsa,digital-signature,Java,Rsa,Digital Signature,这可能与以下内容重复: ,但答案并没有回答我的问题 有以下代码: String RSA_CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding"; String RSA_KEY_FACTORY_ALGORITHM = "RSA"; String RSA_SIGNATURE_ALGORITHM = "SHA512withRSA"; KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_FACTORY_ALGORIT

这可能与以下内容重复: ,但答案并没有回答我的问题

有以下代码:

String RSA_CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding";
String RSA_KEY_FACTORY_ALGORITHM = "RSA";
String RSA_SIGNATURE_ALGORITHM = "SHA512withRSA";

KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_FACTORY_ALGORITHM);
RSAPublicKey key = (RSAPublicKey)keyFactory.generatePublic(pubKeySpec);

Signature signature = Signature.getInstance(RSA_SIGNATURE_ALGORITHM);
signature.initVerify(key);
signature.update(data);
出现以下错误:

java.security.SignatureException: Signature encoding error
at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:204)
at java.security.Signature$Delegate.engineVerify(Signature.java:1219)
at java.security.Signature.verify(Signature.java:652)


当您的签名确实包含(步骤4和5)但不包含所用哈希方法的DER编码标识符时,通常会发生这种情况。该编码标识符以表示ASN.1序列的DER标记开始(步骤1和2)

您可以使用原始RSA密码查看编码:

// setup
Signature sigAlg = Signature.getInstance("SHA512withRSA");
sigAlg.initSign(keyPair.getPrivate());
byte[] signature = sigAlg.sign();

// check padding manually
Cipher rsaRaw = Cipher.getInstance("RSA/ECB/NoPadding");
// encrypt or decrypt is actually the same operation for raw RSA
rsaRaw.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] paddedSig = rsaRaw.doFinal(signature);
// using Bouncy Castle's hex encoder, you can use any encoder
System.out.println(Hex.toHexString(paddedSig));
然后,在大量
FF
字节(填充)和单个字节值
00
之后,您可以实际看到序列字节(值
30

0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003051300d060960864801650304020305000440cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e

您可能只会得到表示哈希值的64个字节。

我可以如何处理传入的签名以使其工作?踢向发送签名的人,让他使用有效且正确的签名格式。或者如果他们持续向您发送错误的值:使用
“RSA/ECB/NoPadding”
并自己提取哈希值。然后与计算的哈希值进行比较。
0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003051300d060960864801650304020305000440cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e