2

ランダム アクセス AES CTR モードの非常に良い例があり、それは動作します: Android で AES CTR モードを使用したランダム アクセス InputStream

private static final int AES_BLOCK_SIZE = 16;
private static IvParameterSpec calculateIVForOffset(final IvParameterSpec iv,
    final long blockOffset) {
final BigInteger ivBI = new BigInteger(1, iv.getIV());
final BigInteger ivForOffsetBI = ivBI.add(BigInteger.valueOf(blockOffset
        / AES_BLOCK_SIZE));

final byte[] ivForOffsetBA = ivForOffsetBI.toByteArray();
final IvParameterSpec ivForOffset;
if (ivForOffsetBA.length >= AES_BLOCK_SIZE) {
    ivForOffset = new IvParameterSpec(ivForOffsetBA, ivForOffsetBA.length - AES_BLOCK_SIZE,
            AES_BLOCK_SIZE);
} else {
    final byte[] ivForOffsetBASized = new byte[AES_BLOCK_SIZE];
    System.arraycopy(ivForOffsetBA, 0, ivForOffsetBASized, AES_BLOCK_SIZE
            - ivForOffsetBA.length, ivForOffsetBA.length);
    ivForOffset = new IvParameterSpec(ivForOffsetBASized);
}

return ivForOffset;
}

ただし、AES GCM モードでは機能しません。復号化するとガベージが発生します。私は暗号化の専門家ではなく、すでに数日間解読しようとしていました。多分誰でもそれについての洞察を与えることができますか?どうにかしてオフセットの IV 計算を変更する必要があるか、認証タグ (私は使用していません) と関係があると思います。

4

2 に答える 2