2017-11-07 4 views
-2

変な文字が「™aを> *:カントー>¥%¢」その後UDP Javaソケットプログラミングは、データの受信時に、それは私が私にこの与えRC4暗号スルー列合格した

、私はそれを送りました以上、このコード

socket.receive(packet); 
test = packet.getData(); 
System.out.println(new String(test)); 

DatagramPacket C1C2 = new DatagramPacket(RC4cipherData, RC4cipherData.length, IPAddress,9876); 
clientSocket.send(C1C2); 

だから私は、ホスト/サーバ側で、受信した後に、このコードを使用して、使用して私が取得この*:>、私がしようとしましたRC4を使って解読しましたが失敗しましたが、usi上記の暗号テキストをプレーンテキストに戻すことができました。

追加データ君たちは

byte[] RC4cipherData = rc4.encryptMessage(RC4ptext, RK.toString()); 

が必要な場合は、誰もがこれらの奇妙な文字に有効にする暗号文の原因を説明することはできますか?

RC4コード

import java.nio.charset.Charset; 
import java.nio.charset.StandardCharsets; 
import java.util.Arrays; 

/** 
* Implementation of RC4 stream cipher 
* 
* @author Iurii Sergiichuk 
*/ 
public class RC4 { 
    private static final int SBOX_LENGTH = 256; 
    private static final int KEY_MIN_LENGTH = 5; 
    /** 
    * Key array 
    */ 
    private byte[] key = new byte[SBOX_LENGTH - 1]; 
    /** 
    * Sbox 
    */ 
    private int[] sbox = new int[SBOX_LENGTH]; 

    public RC4() { 
     reset(); 
    } 

    public RC4(String key) throws InvalidKeyException { 
     this(); 
     setKey(key); 
    } 

    private void reset() { 
     Arrays.fill(key, (byte) 0); 
     Arrays.fill(sbox, 0); 
    } 

    /** 
    * Encrypt given message String with given Charset and key 
    * 
    * @param message message to be encrypted 
    * @param charset charset of message 
    * @param key  key 
    * @return encrypted message 
    * @throws InvalidKeyException if key length is smaller than 5 or bigger than 255 
    */ 
    public byte[] encryptMessage(String message, Charset charset, String key) 
      throws InvalidKeyException { 
     reset(); 
     setKey(key); 
     byte[] crypt = crypt(message.getBytes()); 
     reset(); 
     return crypt; 
    } 

    /** 
    * Encrypt given message String with given Key and pre-defined UTF-8 charset 
    * 
    * @param message message to be encrypted 
    * @param key  key 
    * @return encrypted message 
    * @throws InvalidKeyException if key length is smaller than 5 or bigger than 255 
    * @see StandardCharsets 
    */ 
    public byte[] encryptMessage(String message, String key) 
      throws InvalidKeyException { 
     return encryptMessage(message, StandardCharsets.UTF_8, key); 
    } 

    /** 
    * Decrypt given byte[] message array with given charset and key 
    * 
    * @param message message to be decrypted 
    * @param charset charset of message 
    * @param key  key 
    * @return string in given charset 
    * @throws InvalidKeyException if key length is smaller than 5 or bigger than 255 
    */ 
    public String decryptMessage(byte[] message, Charset charset, String key) 
      throws InvalidKeyException { 
     reset(); 
     setKey(key); 
     byte[] msg = crypt(message); 
     reset(); 
     return new String(msg); 
    } 

    /** 
    * Decrypt given byte[] message array with given key and pre-defined UTF-8 
    * charset 
    * 
    * @param message message to be decrypted 
    * @param key  key 
    * @return string in given charset 
    * @throws InvalidKeyException if key length is smaller than 5 or bigger than 255 
    * @see StandardCharsets 
    */ 
    public String decryptMessage(byte[] message, String key) 
      throws InvalidKeyException { 
     return decryptMessage(message, StandardCharsets.UTF_8, key); 
    } 

    /** 
    * Crypt given byte array. Be aware, that you must init key, before using 
    * crypt. 
    * 
    * @param msg array to be crypt 
    * @return crypted byte array 
    * @see <a href="http://en.wikipedia.org/wiki/RC4#Pseudo-random_generation_algorithm_.28PRGA.29">Pseudo-random generation algorithm</a> 
    */ 
    public byte[] crypt(final byte[] msg) { 
     sbox = initSBox(key); 
     byte[] code = new byte[msg.length]; 
     int i = 0; 
     int j = 0; 
     for (int n = 0; n < msg.length; n++) { 
      i = (i + 1) % SBOX_LENGTH; 
      j = (j + sbox[i]) % SBOX_LENGTH; 
      swap(i, j, sbox); 
      int rand = sbox[(sbox[i] + sbox[j]) % SBOX_LENGTH]; 
      code[n] = (byte) (rand^msg[n]); 
     } 
     return code; 
    } 

    /** 
    * Initialize SBOX with given key. Key-scheduling algorithm 
    * 
    * @param key key 
    * @return sbox int array 
    * @see <a href="http://en.wikipedia.org/wiki/RC4#Key-scheduling_algorithm_.28KSA.29">Wikipedia. Init sbox</a> 
    */ 
    private int[] initSBox(byte[] key) { 
     int[] sbox = new int[SBOX_LENGTH]; 
     int j = 0; 

     for (int i = 0; i < SBOX_LENGTH; i++) { 
      sbox[i] = i; 
     } 

     for (int i = 0; i < SBOX_LENGTH; i++) { 
      j = (j + sbox[i] + (key[i % key.length]) & 0xFF) % SBOX_LENGTH; 
      swap(i, j, sbox); 
     } 
     return sbox; 
    } 

    private void swap(int i, int j, int[] sbox) { 
     int temp = sbox[i]; 
     sbox[i] = sbox[j]; 
     sbox[j] = temp; 
    } 

    /** 
    * Setup key 
    * 
    * @param key key to be setup 
    * @throws InvalidKeyException if key length is smaller than 5 or bigger than 255 
    */ 
    public void setKey(String key) throws InvalidKeyException { 
     if (!(key.length() >= KEY_MIN_LENGTH && key.length() < SBOX_LENGTH)) { 
      throw new InvalidKeyException("Key length has to be between " 
        + KEY_MIN_LENGTH + " and " + (SBOX_LENGTH - 1)); 
     } 

     this.key = key.getBytes(); 
    } 

} 

/** 
* Exception made for recognise invalid keys 
* 
* @author Iurii Sergiichuk 
*/ 
class InvalidKeyException extends RuntimeException { 

    private static final long serialVersionUID = -2412232436238451574L; 

    public InvalidKeyException(String message) { 
     super(message); 
    } 

} 

Serverコード

socket.receive(packet); 
      test = packet.getData(); 
      // test = new byte[packet.getlength()]; 
      System.out.println(new String(test)); 

クライアントコード

byte[] RC4cipherData = rc4.encryptMessage(RC4ptext, RK.toString()); 
       System.out.println("encryption: " + new String(RC4cipherData)); 
       String RC4decryptData = rc4.decryptMessage(RC4cipherData, RK.toString()); 
       System.out.println("decryption: " + RC4decryptData); 
       //time to send C1 and C2 encrypted to server/alice 
       String C1C2PText = encryptedRK.toString() + "%" + new String(RC4cipherData) + "%"; 
       System.out.println("Test: " + C1C2PText); 
       byte [] C1C2data = C1C2PText.getBytes(); 

       //System.out.println("Print conversion: " + C1C2data[0].); 
       // DatagramPacket C1C2 = new DatagramPacket(C1C2data, C1C2data.length, IPAddress,9876); 
       DatagramPacket C1C2 = new DatagramPacket(RC4cipherData, RC4cipherData.length, IPAddress,9876); 
       clientSocket.send(C1C2); 
+1

暗号文は生のバイトだけなので、 'new String(RC4cipherData)'は 'new String(test)'と同じ意味を持ちません。 –

答えて

0

は、誰もがこれらの奇妙な文字に有効にする暗号文の原因を説明することはできますか?

しました。 Ciphertext、err、の奇妙な文字です。印刷する前に解読してみてください。するときは、あなたが今やっていることとは異なり、各データグラムからpacket.getLength()バイトだけを使用するようにしてください。

+0

暗号化後はthis™*:¢ÞÒ>¥%でした。それを送った後、それは *: > becameになりました。私は解読しても私の平文を与えませんでした。しかし、この™は、私の平文を私に与えます。 – user6235245

+0

あなたがそれを解読するまで、それは見た目とは無関係です。あなたの本当の問題はここでの解読です。疑いもなく、 'packet.getLength()'を使用していないからです。 – EJP

+0

これは私が開発したテストコードです。私はデータの正確なバイトを使用するだけの問題を理解しています。私は実際に自分の実際のコードで行ったように、コードの最後にデリミタを置くので、別の文字列に分割することができます。しかし、今私はあなたに結果を示す – user6235245

関連する問題