我在签署rsa签名时遇到问题。我有一个用私钥加密的签名。但是,在尝试使用公钥验证时遇到问题。我得到以下异常:
java.security.SignatureException: Signature length not correct: got 336 but was expecting 128
at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:189)
at java.security.Signature$Delegate.engineVerify(Signature.java:1219)
at java.security.Signature.verify(Signature.java:652)
at XmlReader.main(XmlReader.java:65)
我通过以下方式检索了我的签名和公钥:
BigInteger modulus = new BigInteger(Base64.getDecoder().decode(publicKeyString));
BigInteger exponent = new BigInteger(Base64.getDecoder().decode("AQAB"));
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);
byte[] sigToVerify = Base64.getDecoder().decode(signatureString);
Signature sig = Signature.getInstance("MD5WithRSA");
sig.initVerify(pubKey);
boolean verifies = sig.verify(sigToVerify);
应用程序在最后一行失败。有关这个异常导致的任何想法吗?
更新
添加了要验证的签名数据:
String data = "...." //hidden since sensitive data
byte[] dataBytes = Base64.getEncoder().encode(data.getBytes());
dataBytes = Base64.getDecoder().decode(dataBytes);
答案 0 :(得分:2)
在致电sig.verify(sigToVerify)
之前,您应致电
sig.update(data);
传递您正在验证签名的数据。
并确保在您的参数中调用verify
只有签名字节。
答案 1 :(得分:1)
嗯,签名大小显然不正确。这意味着至少签名格式不正确; RSA签名本身总是以字节为单位的模数(与密钥大小相同,在您的情况下是一个短的1024位密钥)。
algrid is right通常您必须先更新签名。因此,签名的输入以已签名的数据为前缀是合乎逻辑的。在这种情况下,最后128个字节可能是签名,之前的字节是数据。
签名也可能不是“原始”签名,而是格式化签名,例如,使用PKCS#7 / CMS语法或PGP语法。在这种情况下,您需要一个库来解码它。
请注意,如果没有签名的数据,或者至少是数据的哈希,则无法验证签名。在这种情况下,您只能检查签名的正确性(通过验证RSA模幂运算之前执行的填充,以防我们需要详细说明)。