2017-03-07 9 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가 정확합니다. 하지만 해독하고 "String 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' *를 복제하여. –