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
}
Was bedeutet das? "Ich kann die Entschlüsselungsbytes nicht wirklich herausfinden". Bitte präzisieren Sie, was nicht richtig funktioniert. – Jeremy
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
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