我编写了以下用于签名消息的代码,然后在Bouncy Castle的java中验证它。
正确签署工作但验证不完全正常工作。使用短输入消息进行验证但是输入消息较大(大于106)无法正常工作。
换句话说,当符号输入文本的长度变大时,验证无法完成。代码打印的结果:
signature tampered
并返回主要消息的部分内容。
public static String sigVer(PublicKey pu, PrivateKey pr, String original) throws Exception{
//sign
BigInteger big = ((RSAKey) pu).getModulus();
byte[] text = original.getBytes();
RSAKeyParameters rsaPriv = new RSAKeyParameters(true, big,((RSAPrivateKey) pr).getPrivateExponent());
RSAKeyParameters rsaPublic = new RSAKeyParameters(false, big,((RSAPublicKey) pu).getPublicExponent());
RSAEngine rsa = new RSAEngine();
byte[] data;
Digest dig = new SHA1Digest();
ISO9796d2Signer eng = new ISO9796d2Signer(rsa, dig, true);
eng.init(true, rsaPriv);
eng.update(text[0]);
eng.update(text, 1, text.length - 1);
data = eng.generateSignature();
//verify
eng = new ISO9796d2Signer(rsa, dig, true);
eng.init(false, rsaPublic);
if (!eng.verifySignature(data)) {
System.out.println("signature tampered");
}
try{
if (eng.hasFullMessage()) {
eng.updateWithRecoveredMessage(data);
System.out.println("full");
}
eng.updateWithRecoveredMessage(data);
byte[] message = eng.getRecoveredMessage();
String ss = new String(message);
return ss;
}
catch (Exception e) {
System.out.println("can not recover");
return null;
}
}
为什么eng.hasFullMessage()
函数返回false,如何解决这个问题呢?或者任何人都可以提出另一种解决方案来获取大量输入而没有问题吗?
谢谢大家。