4

.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 を設定しています。

4

1 に答える 1

3

// 別のメソッドで、rsaParams.Exponent と rsaParams.Modulus が設定されます

RSA キーに秘密指数を設定するには、 を使用する必要がありますRSAParameters.DRSAParameters.Exponent公開指数用です。

于 2009-10-21T18:32:36.817 に答える