试图将AES CTR解密Python代码转换为java

时间:2014-09-22 15:25:46

标签: java python encryption aes

这是有问题的代码:

decrypt(self):
    """Decrypt one block"""
    data = self.source.read(1024)
    if not data:
        return ""
    iv = data[:16]
    encrypted = data[16:]
    counter = Crypto.Util.Counter.new(64, prefix=iv[:8], initial_value=struct.unpack(">Q", iv[8:])[0])
    cipher = Crypto.Cipher.AES.new(self.info["CpData"], Crypto.Cipher.AES.MODE_CTR, counter=counter)
    return cipher.decrypt(encrypted)

这是我理解的问题:

counter = Crypto.Util.Counter.new(64, prefix=iv[:8], initial_value=struct.unpack(">Q", iv[8:])[0])

它做了什么以及如何在Java中复制它?目前我有这个,但结果不是我所期望的:

public static byte[] decrypt(byte[] encryptedData) throws Exception {
    Key key = new SecretKeySpec(keyBytes, "AES");
    Cipher c = Cipher.getInstance("AES/CTR/NoPadding"); 

    byte[] iv = Arrays.copyOfRange(encryptedData, 0, 16) ; // first 16 bytes
    byte[] data = Arrays.copyOfRange(encryptedData, 16, 1024); // rest

    IvParameterSpec ivSpec = new IvParameterSpec(iv);

    c.init(Cipher.DECRYPT_MODE, key, ivSpec);
    byte[] decValue = c.doFinal(data);
    return decValue;
}

谷歌搜索时间没有产生可用的结果。如何在Java中使用此计数器? 谢谢!

1 个答案:

答案 0 :(得分:0)

快速浏览一下,看来传入的密文前面有8个字节的IV。提取前8个字节并将其用作IV以设置AES-CTR。然后解密其余的密文。