.NETに変換しようとしているjavaのサンプルコードがあります。このコードは、文字列を暗号化し、署名を追加します。 BouncyCastleプロバイダを使用するJavaコードと署名を追加するためのコードが続きます。異なる署名を生成する.NETとJava
InputStream in = new FileInputStream(derkeyfilename);
byte[] privKeyBytes = new byte[in.available()];
in.read(privKeyBytes);
KeyFactory rsaKeyFac = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(privKeyBytes);
private RSAPrivateKey myPrivateKey = (RSAPrivateKey) rsaKeyFac.generatePrivate(encodedKeySpec);
MessageDigest md = MessageDigest.getInstance("MD5", "BC");
byte[] digest = md.digest(msg);
Signature sig = Signature.getInstance("MD5withRSA", "BC");
sig.initSign(myPrivateKey);
sig.update(digest);
byte[] signature = sig.sign();
byte[] base64 = Base64.encodeBase64(signature);
String signature = new String(base64);
これをC#に変換する手助けができます。私はいくつかのサンプル(C#用のBouncyCastle、opensslなど)を試して、すべてがjavaが生成するものとは異なる同じシグネチャを返す。私が見つけたもう一つの事は、C#でサポートされていないjavaの.der秘密鍵です(私が知る限り)。同じ証明書に.pemキーを使用しています。
'InputStream'からの読み方は、で始まるように壊れています。個人的に私は 'available()'を信用することは決してありません。あなたはストリームから読み込んで、 'read'からの戻り値を無視してはいけません。ダイジェスト自体が同じかどうかを確認しましたか?どのようにバイトから文字列を始めて取得していますか? C#で試したことを含め、短いが完全な*例が本当に助けになります。複数の.NETアプローチが同じシグネチャを提供している場合は、おそらく正しいものでしょう... –
さらに、「シグネチャ」にMD5ダイジェストを提供しているだけです...あなたは入力を提供してはいけませんデータ( 'msg')? –
@Jonダイジェストは完全なデータではなく、常に署名されています。 –