首页 文章

RC4解密Java

提问于
浏览
1

我一直在寻找网络,并在这里找到了很多有用的东西,特别是,我很接近,但我无法弄清楚解密字节 . 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
}

1 回答

  • 1

    解决方案很简单 . 只需要创建原始S-Box的另一个实例来保持原始状态 . 加密是围绕索引进行交换

    int[] S = myKSA(key);
    int[] S2 = myKSA(key); //to hold original state after encrypt
    

相关问题