2017-03-07 83 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' *。 –