签名消息,并验证与由充气城堡恢复消息(sign the message and verify wit

2019-09-19 07:18发布


我写了下面的代码签名邮件,然后通过充气城堡验证,在java中。
签约正常工作,但在验证无法正常工作。 代码打印的结果:
签名篡改
无法恢复
并返回null。
为什么eng.hasFullMessage()函数返回false,为什么下面的代码不能正常工作?
感谢所有。

 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(); String signature = data.toString(); //verify eng = new ISO9796d2Signer(rsa, dig, true); eng.init(false, rsaPublic); text = signature.getBytes(); if (!eng.verifySignature(text)) { System.out.println("signature tampered"); } try{ if (eng.hasFullMessage()) { eng.updateWithRecoveredMessage(signature.getBytes());
} byte[] message = eng.getRecoveredMessage(); String ss = message.toString(); return ss; } catch (Exception e) { System.out.println("can not recover"); return null;
}

}

Answer 1:

其实,以验证较大的消息,你必须提供的原始信息,而不仅仅是签名只适用于完全恢复验证输入

//verify
eng = new ISO9796d2Signer(rsa, dig, true);
eng.init(false, rsaPublic);

// when verifying there has to be also the original plain text
eng.update(text,0,text.length);

signBytes = signature.getBytes(); 
if (!eng.verifySignature(signBytes)) {
     System.out.println("signature tampered");
}


Answer 2:

我打得四处这种方法,也收到错误。 除了提到的“更新”方法不起作用与“updateWithRecoveredMessage”不存在。

一些测试后,我想通:

  • 我有起诉的getBytes( “UTF-8”)和一个String =新字符串(消息 “UTF-8”)
  • 我可以在签名使用最多234个字节,与235这将打破。 (猜测这将是256个字节,但一些被用于填充/标记)

如果我理解正确的问题是,签名者只允许包含在签名字节一定量。

如果使用较长的有效载荷必须包括在验证步骤中的有效载荷,以及:

    eng.init(false, rsaPublic);
    byte[] message = payload.getBytes("UTF-8");
    eng.update(message, 0, message.length);

然后验证工作得很好,你会得到有效载荷的第一部分与eng.getRecoveredMessage()。

对于我这个击败目的,所以我走了另一条途径。

我使用的解决方法是两个两步走的方法:

1)I生成),其被存储在签名2短按键使用对称(即,AES)的大有效载荷进行加密。 我也产生了有效载荷的哈希值。 3)用于有效载荷密钥和散列是包括在签名中的一个。



文章来源: sign the message and verify with recover message by Bouncy Castle