2009-10-21 72 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