1

Java で des を使用して少し暗号化に取り組んでいます。いくつかのメソッドといくつかのjunitテストケースがあります。問題のあるメソッドは、バイト配列とintを受け取り、その位置(int)でビットを反転します。合計 64 ビットの 8 バイトのバイト配列を使用するように、16 進バイト配列 [ ad 12 45 67 c3 65 3a 66 ] を受け取り、それを 64 ビット長のバイナリ文字列に変換し、任意の位置を反転します。このメソッドは、junit (私に与えられた) のテスト ケースに合格しますが、プログラムで何か他のことをしようとしていますが、通常は Flip を呼び出すことはできません。

ここにコードとエラーが表示されます。フリップの最初の for ループで、人々は <= を < に変更することを提案しますが、それを行うと、junit テストに失敗します。

私の目標は、与えられた平文を一度に 1 ビットずつ調べて反転させ、与えられた暗号文の変化を観察することです。これが diff メソッドの用途です (2 バイト配列間の差分をカウントするため)。これはすべて、メインの小さな for ループで行われます。

public static void main(String[] args){

        //take original plain text and get the ct to compare all other ct's to
        String plaintxt = "Coolbro!";
        byte [] ptAr = getBytes(asciiToHex(plaintxt));
        byte [] ctFinal = encrypt(ptAr);
        byte [] ptCopy;
        byte [] newCt;
        int differences =0;

        for ( int j = 63; j >= 0; j--){

            ptCopy = flip(ptAr, 2);
            newCt = encrypt(ptCopy);
            differences = diff(ctFinal,newCt);
            System.out.println(differences);

        }


    }

    public static int diff( byte [] a, byte [] b){
    int diff = 0;
    String byteAr1;
    String byteAr2;
    char A1 [];
    char A2 [];

    byteAr1 = hexToBin(a);
    byteAr2 = hexToBin(b);

    A1 = byteAr1.toCharArray();
    A2 = byteAr2.toCharArray();

    for( int i = 0; i < A1.length; i++){
        if(A1[i] != A2[i]){
            diff++;
        }
    }
    return diff;
}

    public static byte [] flip(byte [] a, int position){

        byte[] copy = a;
        String temp = "";
        String tempf = "";
        for(int i = 0; i <= a.length; i++){
            temp = temp + String.format("%8s", Integer.toBinaryString(a[i])).replace(' ', '0');
        }
        if(temp.charAt(position) == '1'){
            for(int i = 0; i < temp.length(); i++){
                if (i == position){
                    tempf += "0";
                }
                else{
                    tempf += temp.charAt(i);
                }
            }
        }
        else{
            for(int i = 0; i < temp.length(); i++){
                if (i == position){
                    tempf += "1";
                }
                else{
                    tempf += temp.charAt(i);
                }
            }
        }
        temp = Integer.toHexString(Integer.parseInt(tempf, 2));
        byte [] fin = temp.getBytes();


        return fin;

これが私のために生成するエラーです:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
at AvalancheUtilities.flip(AvalancheUtilities.java:55)
at AvalancheUtilities.main(AvalancheUtilities.java:18)

上記のように、<= を単に < に変更すると、これらのエラーが発生します。

Exception in thread "main" java.lang.NumberFormatException: For input string: "0110001101101111011011110110110001100010011100100110111100100001"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at AvalancheUtilities.flip(AvalancheUtilities.java:77)
at AvalancheUtilities.main(AvalancheUtilities.java:18)

どちらの場合もどのように処理すればよいかわかりません。テストケースに合格するので、できれば <= に固執したいと思います。

私が知っている助けをありがとう!

4

1 に答える 1

0

Your "people" are correct, you want to change the <= to a <. Looking at your exception, you only have 8 items in your array, which means you can only index from 0 to 7. The last index will always be 1 less than the length of the array.

For the other exception, the problem is that your number is too large. See Integer.MAX_VALUE.

Switch it to:

temp = Long.toHexString(Long.parseLong(tempf, 2));
于 2013-03-01T03:39:58.840 に答える