2009-10-21 122 views
4

我在基于.net的智能卡上签署了一些数据,并试图在java环境中验证签名 - 但没有成功。Java和.NET interop on(RSA)签名

智能卡(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的密钥生成:

// 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和国防部。

+0

在Java中,您如何生成RSA公钥? – Kevin 2009-10-21 18:21:50

+0

新增了密钥代码 – wilth 2009-10-21 21:38:20

回答

3

//在不同的方法,rsaParams.Exponent和rsaParams.Modulus设置

要设置RSA密钥的私人指数,你应该使用RSAParameters.DRSAParameters.Exponent公开指数。

+0

哇,你认真吗?这将解释它;-) 尝试它(设置模数和D),我在导入时得到加密异常 - 根据文档,我可能会错过RSAParameters中的一些参数。任何人都知道哪些是必需的? – wilth 2009-10-21 21:33:54

+1

它也在等待公开指数 - 一旦这个设定起作用。 Thx很多提示! – wilth 2009-10-21 21:40:35