我一直在寻找网络,并在这里发现了很多有用的东西,特别是,我已经关闭,但我无法弄清楚解密字节。 Decrypt是否无效,因为我在字节数组中发送函数负值?
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 :(得分:1)
解决方案很简单。只需要创建原始S-Box的另一个实例来保持原始状态。加密是围绕
交换索引RealmQuery