나는 웹을 둘러 보았고 여기에서 많은 도움이되는 자료를 발견했다. 특히 가까웠지만 해독 바이트를 알아 내지 못한다. 바이트 배열에 함수의 음수 값을 보내므로 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
}
이게 무슨 의미입니까? "해독 바이트를 알아낼 수 없습니다." 올바르게 작동하지 않는 부분에 대해 자세히 설명하십시오. – Jeremy
제 평문 바이트가 정확하고 암호문 바이트와 cipherHex가 정확합니다. 하지만 해독하고 "String s = new String (dcbytes)"할 때 원래의 일반 텍스트를 얻지 못합니다. – user3412695
어디서 해독하는지 알지 못합니다. 너는 두 번 암호화하는거야? (나는이 알고리즘에 익숙하지 않은 것처럼 착각 할 수있다.) – Jeremy