gpt4 book ai didi

Java 和 .NET 互操作 (RSA) 签名

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:48 26 4
gpt4 key购买 nike

我正在基于 .net 的智能卡上签署一些数据并尝试在 Java 环境中验证该签名 - 但没有成功。

智能卡 (c#):

RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(1024);
// In a different method, rsaParams.Exponent and rsaParams.Modulus are set
rsaProvider.ImportParameters(rsaParams); // Here I'm importing the key
SHA1 sha1 = SHA1.Create();
byte[] signature = rsaProvider.SignData(data, sha1);

客户端(Java):

Signature sig = Signature.getInstance("SHA1withRSA");
sig.initVerify(rsaPublicKey); // initiate the signature with public key
sig.update(data); // update signature with the data that was signed by the card
sig.verify(signedData); // Test card signature - this always returns false

然后我尝试在 Java 客户端上创建签名(用于测试)——事实证明,在 Java 客户端上创建的签名与在智能卡上创建的签名不同。我是这样创建的:

Signature sig = Signature.getInstance("SHA1withRSA");
sig.initSign(rsaPrivateKey);

sig.update(data);
locallySigned = sig.sign();

现在我明白签名类似于(传递的数据+使用的算法)的散列。这里的实现是否可能不兼容?我还缺少其他东西吗?谢谢!

PS:是的,我验证了输入和输出都从卡正确传输/到卡,设置了关键参数并且输入/输出完全相同。

编辑:Java 中的 key 生成:

// Create a key-pair and install the private key on the card
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(1024, random);

KeyPair keyPair = keyGen.genKeyPair();

privateKey = (RSAPrivateKey)keyPair.getPrivate();
publicKey = (RSAPublicKey)keyPair.getPublic();

然后我在卡上设置私钥的 exp 和 mod。

最佳答案

// In a different method, rsaParams.Exponent and rsaParams.Modulus are set

要在 RSA key 中设置私有(private)指数,您应该使用 RSAParameters.D . RSAParameters.Exponent 用于公共(public)指数。

关于Java 和 .NET 互操作 (RSA) 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1601560/

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