如何在 AES/CTR 加密中获取特定计数器的密钥流块

How to get a key stream block for a specific counter in AES/CTR encryption

我正在使用 Crypto++ 库

我制作了 IV 和密钥并将它们传递给函数

    CTR_Mode< AES >::Encryption e;
    e.SetKeyWithIV(key, 16, iv);

然后当我加密时,我在字符串本身上使用转换过滤器来获取加密的字符串。

我想获得与字符串异或以加密的最终密钥? 有没有办法从加密对象中获取它?

如果您只需要与明文的前 16 个字节进行异或运算的密钥流(如图所示),那么您需要使用相同的 AES CTR 加密设置为 00 的 16 个字节的块模式。一个密钥流块,当与全零进行异或时,只是 returns 相同的流。因此,您可以对所需数量的明文块执行此操作。正如您已经猜到的那样,您需要使用相同的密钥和 IV。

如果您只想解密流中更远​​的内容,那么您需要计算一个新的 16 字节 IV。您可以这样做,因为 IV 直接用作初始计数器(可能右填充零)。所以你只需要计算有多少块被预处理,然后将这个值(作为大端值)添加到 IV。这当然只适用于块边界,如果你想跳转到一个非常具体的偏移量,你可能需要从密钥流中丢弃一些字节。