随机访问加密数据AES GCM模式

随机访问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计算,或者它与auth Tag(我没有使用)有关。

GCM模式使用计数器模式进行机密性。 因此可以在没有认证的情况下解密密文; 看看我的回答。 要从给定的偏移量加密或解密,您可以更改计数器以更改给定偏移量的字节,并对生成的密文进行异或。 但是,如果您跳过一个字节,则无法validation任何密文。

因此,对于GCM,最好将明文分成块并分别加密。