1

私はウェブを見回しており、特にここで多くの役立つものを見つけました。私は近くにいますが、復号化バイトを完全に把握することはできません. 関数に負の値をバイト配列で送信しているため、復号化が機能していませんか?

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
}
4

1 に答える 1

1

解決策は簡単でした。元の状態を保持するために、元の S-Box の別のインスタンスを作成する必要がありました。暗号化はインデックスを交換していました

int[] S = myKSA(key);
int[] S2 = myKSA(key); //to hold original state after encrypt
于 2017-03-07T06:23:13.037 に答える