如何根据数据计算RSA签名,但是根据数据的哈希验证签名(和/或反之亦然)?在内部签名/验证数据只是对数据进行散列,然后对散列进行操作,在其他平台上我可以完成此操作。但在Java中,我似乎无法正确配置签名算法。
如何仅使用数据的哈希来验证签名?
这就是我所拥有的:
import java.security.*;
public class Main {
public static void main(String[] args) throws Exception
{
byte[] data = new byte[] {1,2,3};
MessageDigest digest = MessageDigest.getInstance("SHA1");
digest.update(data);
byte[] sha1Hash = digest.digest();
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(512);
KeyPair keyPair = kpg.genKeyPair();
Signature signingInstance = Signature.getInstance("SHA1withRSA");
signingInstance.initSign(keyPair.getPrivate());
signingInstance.update(data);
byte[] signature = signingInstance.sign();
Signature dataVerifyingInstance = Signature.getInstance("SHA1withRSA");
dataVerifyingInstance.initVerify(keyPair.getPublic());
dataVerifyingInstance.update(data);
boolean dataVerified = dataVerifyingInstance.verify(signature);
Signature hashVerifyingInstance = Signature.getInstance("NONEwithRSA");
hashVerifyingInstance.initVerify(keyPair.getPublic());
hashVerifyingInstance.update(sha1Hash);
boolean hashVerified = hashVerifyingInstance.verify(signature);
System.out.println("Verification based on data: " + dataVerified);
System.out.println("Verification based on hash: " + hashVerified);
}
}
运行此程序的输出是:
Verification based on data: true
Verification based on hash: false
答案 0 :(得分:2)
您必须首先围绕哈希值实现PKCS#1 v1.5填充(正式命名为EMSA-PKCS1-v1_5)。只有在那之后"NONEwithRSA"
才能解决问题。
您当然可以欺骗并查看BouncyCastle或Java的GPL版本的来源。或者,您可以使用BouncyCastle轻量级API,但是您将失去与JCA的兼容性并添加依赖项。
JavaCard
确实具有创建哈希卡的功能。想要在全功能PC上运行的库中不需要这种功能(我也没有在Java 7类中找到它)。