2017-05-25 203 views
1

的隨機存取沒有爲隨機存取AES CTR模式一個很好的例子,它的工作原理: Random access InputStream using AES CTR mode in android加密數據AES GCM模式

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計算,或者這是一個認證標籤(我沒有使用)。

回答

2

對於GCM模式,底層密碼也是CTR。 Java實現將認證標籤添加到密文。

不幸的是,您不能直接使用它來使用高級實現從偏移量解密,因爲IV(nonce真正)不是直接使用,而是先被轉換。這使得IV計算不可能。

您可以創建一個計算偏移量的智能CTR實現,但如果跳過單個字節,則無法驗證任何密文。因此,對於GCM,您可能必須分成塊並分別進行加密。


GCM 可以包含在線財產:直接加密/解密的明文/密文流,無緩衝。但是,Java實現將認證標籤添加到密文的末尾,使得不可能在沒有緩存的情況下直接解密密文(至多達到認證標籤的大小)。

不幸的是,在跳過字節時會出現更多問題。這並不奇怪,因爲驗證將不可用。一個非常聰明的實現可能會驗證密文而不解密其中的一部分但您仍然必須通過所有數據來計算基礎GMAC值。