4

BouncyCastle の暗号化 API の Java バージョンを調べてみました。PaddedBufferedBlockCipherクラスに少し混乱しています。その目的は、暗号化を段階的に処理するため、つまりファイルからデータを読み取るためであることは理解しています (おそらく間違っていますか?)。

processBytes() を 1 回呼び出して、暗号化するすべてのデータを一度に提供し、次に doFinal() を呼び出すと、期待どおりに動作します。ただし、適切なオフセット/長さを使用して processBytes を複数回呼び出し、小さなチャンクで処理するつもりで doFinal() を実行すると、失敗します。次のコードが失敗する理由を説明できる人はいますか? 値は、clearText の長さが 64 バイトであり、暗号化が 4 x 16 バイトのブロックで実行されるという前提でハードコーディングされています。

byte[] key= Hex.decode("a4ea1a7227e032c37f5635e70ba1bd38a4ea1a7227e032c37f5635e70ba1bd38");
byte[] iv= Hex.decode("a4ea1a7227e032c37f5635e70ba1bd38");
byte[] clearText= Hex.decode("28d3966905e33c063e7b74c7c7dcb2d688d48d53101d2a6901d365146faf0c9cde3da9ef37664a5e32e4e468f9b52f587d76b78caaf9d9823dd9eb2c1d700d7c");

BlockCipher bc  = new AESFastEngine();
CBCBlockCipher cipher   = new CBCBlockCipher(bc);
PaddedBufferedBlockCipher mode  = new PaddedBufferedBlockCipher(cipher);
KeyParameter kp = new KeyParameter(key);
CipherParameters ivAndKey= new ParametersWithIV(kp, iv);
mode.init(true, ivAndKey);

byte[] outBuf   = new byte[mode.getOutputSize(clearText.length)];

int blockSize    = mode.getBlockSize();

// process the 64 bytes of clearText, in 4 x 16-byte chunks 
for (int i = 0; i < 4; i++) {

    mode.processBytes(clearText, i * blockSize, blockSize, outBuf, i * blockSize);
}

try {
    // call doFinal on the last block (bytes 48->64)
    mode.doFinal(outBuf, 48);
} catch (Exception e){}

System.out.println(new String(Hex.encode(outBuf))); 

The expected output is: fe391ed41650f3b344ed3d200ffa3c55e71b1d97dbd91c0fbdd0989c3a48822e7e5230e9d6d073bc0752436d9bea9f26328a11586a290e712fbbf874ddfd4ba14e28600e55c7d6ac69467693320a82d3

But the result I'm getting is: 00000000000000000000000000000000fe391ed41650f3b344ed3d200ffa3c55e71b1d97dbd91c0fbdd0989c3a48822e328a11586a290e712fbbf874ddfd4ba14e28600e55c7d6ac69467693320a82d3

編集

PeterDettman の提案に従ってコードを修正しました。

int bytesProcessed = 0;

for (int i = 0; i < 4; i++) {
            // Fixed to be '+='
    bytesProcessed += mode.processBytes(clearText, i * blockSize, blockSize, outBuf, bytesProcessed);
}

mode.doFinal(outBuf, bytesProcessed);
4

1 に答える 1