簡體   English   中英

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

[英]Java and .NET interop on (RSA) signatures

我正在基於.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中的密鑰生成:

// 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.D RSAParameters.Exponent用於公共指數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM