Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和.NET互操作(RSA)签名_Java_.net_Cryptography_Digital Signature - Fatal编程技术网

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

Java和.NET互操作(RSA)签名,java,.net,cryptography,digital-signature,Java,.net,Cryptography,Digital Signature,我在基于.net的智能卡上对一些数据进行签名,并试图在java环境中验证该签名,但没有成功 智能卡(c): RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(1024); // In a different method, rsaParams.Exponent and rsaParams.Modulus are set rsaProvider.ImportParameters(rsaParams); // H

我在基于.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);
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):

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);
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中的密钥生成:

// 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

//在另一种方法中,设置rsaparms.指数和rsaparms.模数


要在RSA密钥中设置私有指数,应使用
rsapameters.Exponent
表示公共指数。

在Java中,如何生成RSA公钥?哇,你是认真的吗?这就解释了;-)尝试一下(设置模数和D),我在导入时遇到一个加密异常-根据文档,我可能会错过RSAPERAMETERS中的一些参数。有人知道哪些是必需的吗?它也在等待公共指数——一旦设置好,它就会工作。谢谢你的提示!