2

少しの暗号化に取り組んでいて、範囲外の例外の配列に遭遇しました。私はそれを紙の上で数回たどりました、そしてすべてが私には大丈夫であるように思われるので、私は本当にエラーの原因を特定することができません。誰かが助けることができればそれは素晴らしいでしょう!

   static byte[] encrypt(byte[] ptBytes, javax.crypto.SecretKey key, byte[] IV){

    byte [] ct; 
    byte [] pt;
    byte [] ptBlock, ctBlock;
    int bytes;              //the number of bytes left over in the last block // this comes into play w/ the last 2 blocks witht the swap and stuff

    //get the extra bytes in case last block of plain text isn't whole
    bytes = ptBytes.length%16;

    //pad the plain text array to proper length
    pt = Arrays.copyOf(ptBytes, (((ptBytes.length )/16) + 1) * 16 );
    System.out.println(Arrays.toString(pt));

    //ctBlock = one block of cipher text
    ctBlock = new byte [16];

    //make ct the length of the padded pt 
    ct = new byte [pt.length];

    //do the encryption
    //i is for the current block of plain / cipher text we are on
    for( int i = 1; i <= ((ptBytes.length )/16)+1; i++){
        if( i == 1 ){

            //make ptBlock the first block of the entire plain text
            ptBlock = Arrays.copyOfRange(pt, 0, (i*16));

            //since i = 1 do the XOR to get new plain text with IV
            for (int j = 0; j < ptBlock.length - 1; j++){
                ptBlock[j] = (byte)(ptBlock[j] ^ IV[j]);
            }

            //now time to do the encryption between the current block of plain text and the key
            try {
                ctBlock = AES.encrypt(ptBlock, key);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            //now put the cipher text block we just got into the final cipher text array
            for( int k = 0; k < ctBlock.length; k++){
                ct[k] = ctBlock[k];
            }


        }
        else{
            //make ptBlock the current number block of entire plain text
            ptBlock = Arrays.copyOfRange(pt, (i-1)*16, (i*16));

            //now XOR the plain text block with the prior cipher text block
            for(int j = 0; j < ptBlock.length - 1; j++){
                ptBlock[i] = (byte) (ptBlock[j] ^ ctBlock[j]);
            }

            //now time to do the encryption between the current block of plain text and the key
            try {
                ctBlock = AES.encrypt(ptBlock, key);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            //now put the cipher text block we just got into the final cipher text array
            for( int k = (i-1)*16; k < (i*16)-1; k++){
                ct[k] = ctBlock[k-16];
            }
        }
    }

    return ct;
}

エラーはこの行にあると表示されます

ct[k] = ctBlock[k-16];

これはあまり意味がありません。配列ctの長さは48、ctBlockの長さはlen 16であり、このエラーがforループにある場合、iは2または3に等しいため、サイズ16バイトの配列を2/3のいずれかに追加します。配列ctまたは3番目の3分の1。そして、私が言ったように、私はそれを紙にトレースしました、そしてそれは合法であるように見えました。

前もって感謝します!

4

2 に答える 2

1

の場合を考えてみましょうi = 3

for( int k = (i-1)*16; k < (i*16)-1; k++){
    ct[k] = ctBlock[k-16];
}

ここ -

  • kは32から始まります
  • 条件は32<47になります
  • の配列インデックスはctBlock32-16= 16になり、bam!配列インデックスが範囲外です!

クイックフィックス-

for( int k = (i - 1) * 16; k < (i * 16) - 1; k++){
    ct[k] = ctBlock[k - (16 * (i - 1))];
}
于 2013-03-27T04:33:04.317 に答える
0

の場合i == 3、あなたが言ったように、それk == 32から始めて、に増加し47ます。これはサイズ16の配列であると言います。ctBlockこの場合、インデックスの要素にアクセスしようとするとエラーがスロー16されます。31

于 2013-03-27T04:32:16.697 に答える