2011-12-27 11 views
0

私はRSAとRC4を使って小さな認証方式を開発しています。私の現在のポイントでは、クライアントの公開鍵を使用して暗号化されたランダムに生成されたセッション鍵をクライアントに送信しようとしています。そこから、クライアントはセッション鍵を読み取り、その秘密鍵を使って解読し、ハッシュをサーバに送り返します(問題の一部ではないため、より細かいセキュリティ機構には入っていません)。秘密鍵は暗号化されているときに異なる結果を与える秘密鍵を復号化しますか?

現在のところ、サーバーにクライアントの公開キーと同じコピーがあることを確認しました。私は、サーバーがクライアントの公開鍵でランダムに生成されたセッション鍵を暗号化していることを知っています。だからそこに問題はないだろう。

私は問題がキーの転送内にあると思う。キーが文字列型であり、そしてように初期化される -

String sessionKey = new BigInteger(128, server.random).toString(128); 

とDataOutputStreamをを使用してクライアントに転送される -

o.writeUTF(this.encryptedSessionKey); 

encryptedSessionKeyは通常の文字列、ない特定のエンコードです。私はおそらく、復号化すると、Java modified UTF-8のエンコーディングは、セッションキーを不正な形式にすると考えています。私ように解読 -

this.sessionKey = new String(cryptUtil.rsaDecrypt(clientPrivateKey, this.encryptedSessionKey.getBytes())); 
// Where encryptedSessionKey is read from the stream using i.readUTF(); 

なる使用するString.getBytes()はJavaでエンコードされた文字列にUTF-8が変更(DataInputStream.readUTFから読み出し())なし特定のエンコーディングでインスタンス文字列とは異なるデータを返しますか?

byte[] encryptedSessionKeyAsBytes = cipher.doFinal(...); 
String encryptedSessionKey = new String(encryptedSessionKeyAsBytes); 

これは間違っている:

答えて

2

私の推測では、あなたがこのような何かをやっているということです。 Stringコンストラクタは、デフォルトのプラットフォームエンコーディングを使用してバイトを文字に変換しています。そして、すべてのバイトシーケンスは文字に変換できません。たとえば、デフォルトのエンコーディングがASCIIの場合、すべての負のバイトを文字に変換することはできません。

バイナリデータを転送する必要がある場合はバイト(byte []タイプを使用)として転送するか、Base64を使用してバイトを印刷可能な文字に変換し、ASCII、ISO-8859-1またはUTF-ベース64文字列を転送するためのエンコード

関連する問題