如何根据数据计算RSA签名,但根据数据的哈希(反之亦然)验证该签名?签名/验证 data 内部仅哈希数据,然后在哈希上运行,在其他平台上我可以完成此操作。但是我想,在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
您必须先于围绕哈希值构建PKCS#1 V1.5填充(正式命名为EMSA-PKCS1-V1_5)。只有在那之后才能使用"NONEwithRSA"
工作。
当然,您可以作弊并查看Bouncycastle或Java的GPL版本的来源。另外,您可以使用Bouncycastle轻量级API,但是您会与JCA兼容并添加依赖项。
JavaCard
确实具有创建哈希牌外卡的功能。在旨在在完整的PC上运行的库中,这种功能不太需要太多(我在Java 7类中也没有找到它)。