2017-03-07 2 views
1

Ich habe im Internet gesucht und eine Menge hilfreiche Sachen hier gefunden, vor allem bin ich nah, aber ich kann die Entschlüsselungsbytes nicht ganz herausfinden. Funktioniert das Decrypt nicht, weil ich die Funktion negative Werte im Bytearray sende?RC4 Entschlüsselung Java

import javax.xml.bind.DatatypeConverter; 
public class RC4_Main { 

public static int[] myKSA(String key) { 
    int j = 0, temp = 0; 
    int[] S = new int[256]; 
    int[] T = new int[256]; 
    int[] K = new int[key.length()]; 
    for (int a = 0; a < key.length(); a++) { 
     K[a] = key.charAt(a); 
    } 
    int keyLength = key.length(); 
    // Generation of the S-Box 
    for (int a = 0; a < 256; a++) { 
     S[a] = a; 
     T[a] = Integer.parseInt(Integer.toHexString((char) K[a % (keyLength)]), 16); 
    } 
    for (int a = 0; a < 256; a++) { 
     j = (j + S[a] + T[a]) % 256; 
     temp = S[a]; 
     S[a] = S[j]; 
     S[j] = temp; 
    } 
    return S; 

} 

/*ENCRYPT*/ 
public static byte[] encrypt(byte[] pt, int[] S) { 

    byte[] cipher = new byte[pt.length];// cipher text array 
    int i = 0, k = 0, j = 0, t = 0; 
    byte tmp; // temp placeholder 
    for (int count = 0; i < pt.length; count++) { 
     i = (i + 1) & 0xFF; 
     j = (j + S[i]) & 0xFF; 
     // perform swap 
     tmp = (byte) S[j]; 
     S[j] = S[i]; 
     S[i] = tmp; 
     t = (S[i] + S[j]) & 0xFF ; 
     k = S[t]; 
     cipher[count] = (byte)(pt[count]^k);// XOR 

    } 
    return cipher; 

} 

/*HEX TO BYTE ARRAY*/ 
public static byte[] hexToByteArray(String hex){ 
    return DatatypeConverter.parseHexBinary(hex); 

} 

/*BYTE ARRAY TO HEX STRING*/ 
public static String bytesToHex(byte[] bytes){ 
    String result = ""; 
    for(int i=0; i < bytes.length;i++){ 
     result += Integer.toString((bytes[i] & 0xFF) + 0x100,16).substring(1); 
    } 
    return result; 
} 

public static void main(String[] args) { 
    String key = "12345678"; 
    String pt = "hello"; 
    //String ct = "013d0175c986a8bd9f"; 
    byte M[] = new byte[pt.length()];//message bytes 
    M = pt.getBytes(); 
    System.out.println("PlainText: " + pt); 
    System.out.print("PlaintText bytes: "); 
    for(int i = 0;i<M.length;i++){ 
     System.out.print(M[i] + " "); 
    } 

    /* S-Box from KSA algorithm function*/ 
    int S[] = myKSA(key); 

    /**************************** 
    * Step 1: 
    * based the initial key iamkey, 
    * show the S-box after applying Key Schedule Algorithm 
    ***************************/ 
//  System.out.println("The final S-box after using KSA  algorithmis..."); 
//  for (int i = 0; i < S.length; i++) {  
//  if ((i % 16 == 0) && i > 0) { 
//  System.out.println(); 
//  }//if 
//  System.out.print(S[i] + " "); 
//  } // for 
    /************** 
    * END PRINT S-BOX 
    * ************/ 

    byte ctbytes[] = encrypt(M, S); 

    /*CipherText Bytes*/ 
    System.out.print("\nCipherText Bytes: "); 
    for(int i = 0; i < ctbytes.length; i++){ 
     System.out.print(ctbytes[i] + " "); 
    } 

    /*CipherText Hex Value*/ 
     String CipherHex = bytesToHex(ctbytes); 
    System.out.println("\nCipherText Hex: " +CipherHex); 

    /*Decrypted Bytes*/ 
    System.out.print("Decrypted PT Bytes: "); 
    byte dcbytes[] = encrypt(ctbytes,S); 
    for(int i = 0; i < dcbytes.length; i++){ 
     System.out.print(dcbytes[i]+ " "); 

    } 
    String s = new String(dcbytes); 
    System.out.println(s); 

}// main 
} 
+0

Was bedeutet das? "Ich kann die Entschlüsselungsbytes nicht wirklich herausfinden". Bitte präzisieren Sie, was nicht richtig funktioniert. – Jeremy

+0

Meine Klartext-Bytes sind korrekt, die Chiffretext-Bytes und CipherHex sind korrekt. aber wenn ich entschlüssle und "String s = new String (dcbytes)" mache, bekomme ich den ursprünglichen Klartext nicht – user3412695

+0

Ich sehe nicht, wo du entschlüsseln willst. Sie verschlüsseln nur zweimal? (Ich könnte mich irren, da ich mit diesem Algorithmus nicht vertraut bin ...) – Jeremy

Antwort

1

Lösung war einfach. Ich musste nur eine andere Instanz der ursprünglichen S-Box erstellen, um den ursprünglichen Zustand zu erhalten. Die Verschlüsselung vertauschte die Indizes um

+0

Schön. Ich habe in den letzten Stunden mit diesem Programm gespielt. War Spaß :-) – Jeremy

+1

Ich würde lieber sicherstellen, dass Ihre Eingabe nicht geändert wird, z. indem der Eingabeparameter 'S' * in *' myKSA' geklont wird. –

Verwandte Themen