1

UDP を使用してサーバー クライアント通信を行おうとしていますが、RC4 を使用して暗号化されたテキストを相互に送信する必要があります。次のようになります。

  1. ホストを開始します。

  2. クライアントを起動します。

  3. クライアントは RC4 を使用して暗号化されたテキストを送信します

  4. ホストは暗号化されたテキストを受信し、RC4 を使用して復号化します

私の RC4 はオンライン ソースから取得したもので、動作しているようです。クライアント側で(テスト目的で)暗号化と復号化の両方を行う場合、それは機能します。しかし、暗号化されたテキストをホストに送信した後に問題が発生します。ホストがメッセージを復号化すると、出力が期待どおりの出力ではありません。

クライアントでの私のコードの例を次に示します。

RC4 rc4 = new RC4(rc4Key);      
String message = "Hello";       
char[] result = rc4.encrypt(message.toCharArray());
System.out.println("encrypted string: " + new String(result));              //M®FW?
System.out.println("decrypted string: " + new String(rc4.decrypt(result))); //Hello

上記から、適切に暗号化および復号化できるように見えるため、RC4 が機能していると思います。暗号化されたテキストをホストに送信します

sentence = new String(result);
sendData = sentence.getBytes();
sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);        
clientSocket.send(sendPacket);

ホスト側では、暗号化されたテキストを受け取ります

receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
realSentence = Arrays.copyOf(receivePacket.getData(), receivePacket.getLength());
sentence = new String(realSentence);
RC4 rc4 = new RC4(ad.toString());               
char[] result = rc4.decrypt(sentence);
System.out.println("decrypted string: " + new String(result)); //H?ll?

これは半分の時間しか発生せず、暗号化されたテキストに?特殊文字が含まれている場合にのみ発生するパターンが見られます。したがって、char を string に変換してから byte に変換し、UDP 経由で送信すると、何か問題が発生したと推測しています。

4

1 に答える 1

2

今後の参考のために、これをデバッグする良い方法は、暗号についてはすべて忘れて、既知のバイト配列 (特殊文字を含む) を片側から反対側に送信するテストを作成することです。

そうは言っても、私はこの行が間違っていると思います:

sendData = sentence.getBytes();

ここでは、バイトを取得するときに文字セットを指定していません。これは、プラットフォームのデフォルトを使用していることを意味します。接続の反対側では、次のことを行っています。

sentence = new String(realSentence);

繰り返しますが、文字セットを指定せずにバイトを文字列に変換します。私の推測では、目的地のデフォルトの文字セットが異なっていると思います。

注: このコードは一般的に奇妙に思えます。RC4 暗号が char 配列を返すのはなぜですか? 代わりに、バイト配列を管理し、生の値をネットワーク経由で送信するコードの例を探します。

于 2014-01-28T09:03:02.287 に答える