gpt4 book ai didi

java - Java中如何基于数据签名,但基于哈希验证?

转载 作者:行者123 更新时间:2023-11-30 03:59:41 24 4
gpt4 key购买 nike

如何根据数据计算 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

最佳答案

您必须首先实现围绕哈希值构建的 PKCS#1 v1.5 填充(正式名称为 EMSA-PKCS1-v1_5 )。只有在那之后,"NONEwithRSA" 的技巧才会起作用。

当然,您可以作弊并查看 BouncyCaSTLe 的源代码或 Java 的 GPL 版本。或者,您可以使用 BouncyCaSTLe 轻量级 API,但您会失去与 JCA 的兼容性并添加依赖项。

JavaCard 确实具有创建卡外散列的函数。在打算在全功能 PC 上运行的库中并不需要这种功能(而且我在 Java 7 类中也没有找到它)。

关于java - Java中如何基于数据签名,但基于哈希验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22276976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com