2017-03-07 71 views
1

我一直在環顧網絡,發現很多有用的東西在這裏特別是,我很接近,但我不能完全弄清楚解密字節。 Decrypt不工作,因爲我在字節數組中發送函數負值?RC4解密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

這是什麼意思? 「我無法弄清楚解密字節」。請更具體地說明哪些功能無法正常工作。 – Jeremy

+0

我的明文字節是正確的,密文字節和cipherHex是正確的。但是當我解密並執行「S​​tring s = new String(dcbytes)」時,我沒有得到原始的明文 – user3412695

+0

我沒有看到你解密的地方。你只是加密兩次? (我可能會誤,因爲我不熟悉這個算法......) – Jeremy

回答

1

解決方法很簡單。只需要創建原始S-Box的另一個實例來保存原始狀態。加密是交換索引

int[] S = myKSA(key); 
int[] S2 = myKSA(key); //to hold original state after encrypt 
+0

不錯。最後幾個小時,我結束了這個項目。很有趣:-) – Jeremy

+1

我寧願確保你的輸入沒有改變,例如通過克隆* myKSA內的輸入參數'S' *。 –