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

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

智能卡(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客户端上创建签名(用于测试) – 事实certificate,在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。

//在另一种方法中,设置了rsaParams.Exponent和rsaParams.Modulus

要在RSA密钥中设置私有指数,您应该使用RSAParameters.DRSAParameters.Exponent用于公共指数。