[英]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.