2011-08-10 5 views
0

.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キーを使用しています。

+2

'InputStream'からの読み方は、で始まるように壊れています。個人的に私は 'available()'を信用することは決してありません。あなたはストリームから読み込んで、 'read'からの戻り値を無視してはいけません。ダイジェスト自体が同じかどうかを確認しましたか?どのようにバイトから文字列を始めて取得していますか? C#で試したことを含め、短いが完全な*例が本当に助けになります。複数の.NETアプローチが同じシグネチャを提供している場合は、おそらく正しいものでしょう... –

+0

さらに、「シグネチャ」にMD5ダイジェストを提供しているだけです...あなたは入力を提供してはいけませんデータ( 'msg')? –

+0

@Jonダイジェストは完全なデータではなく、常に署名されています。 –

答えて

2

あなたがC#のポイントを表示しないように、私は、あなたの問題が何であるかを推測することができます。Javaで

、あなたは二重のMD5ハッシュを行っています。一度明示的にコードに入れてから、暗黙的にSignatureオブジェクト(これはMD5WithRSAとして定義されています)を参照してください。あなたは不動点を直撃している場合を除き

signatureC# = RSA(MD5(msg)) 

は明らかにこれらは、同じではありません。したがって、あなたがC#の側で明示的にこの最初のMD5をしない場合は、あなたがそこに持ってここに

signatureJava = RSA(MD5(MD5(msg))) 

を持っていますあなたのメッセージとMD5の(非常にありそうもない)。

これ以外は、C#の署名が常に同じであることを確認してください。私が理解するように、RSA署名は(in the modes normally used)はランダムではないパディングデータを組み込んでいるため、確定的ではありません。

+0

+1残念ながら、PSSはJavaの通常モードではなく、PKCS#1.5パディングのRSAです。 – emboss