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

Encryption 如何在AES/CTR加密中获取特定计数器的密钥流块,encryption,aes,crypto++,Encryption,Aes,Crypto++,我正在使用Crypto++库 我制作了IV和钥匙,并将它们传递给函数 CTR_Mode< AES >::Encryption e; e.SetKeyWithIV(key, 16, iv); CTR_模式::加密e; e、 使用iv设置键(键,16,iv); 然后,当我加密时,我对字符串本身使用转换过滤器来获得加密的字符串 我想得到最后一个加密密钥,它与字符串异或以加密它? 有没有办法从encryption object获取它?如果您只需要与前16个字节的明文异或

我正在使用Crypto++库

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

    CTR_Mode< AES >::Encryption e;
    e.SetKeyWithIV(key, 16, iv);
CTR_模式::加密e;
e、 使用iv设置键(键,16,iv);
然后,当我加密时,我对字符串本身使用转换过滤器来获得加密的字符串

我想得到最后一个加密密钥,它与字符串异或以加密它?
有没有办法从encryption object获取它?

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


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

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


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

您指的是流密钥?将密文与明文进行异或运算,就得到了。如何从key和iv中获取密文?哦,你没有明文。我明白了,生成一个完全由0x00字节组成的明文,其长度与您需要的长度相同,并对其进行加密以获取流密钥。其中一个基类有一个
GetNextIV
。但我认为这不是你想要的。我认为它会生成一个新的IV,并且不会提供密码状态下使用的下一个IV。看,例如,@Marteen-我喜欢标题的变化,但我不确定其中的一些变化是否有意义。加密前后密钥相同。获取加密的CTR块没有帮助,因为他无法增加加密的块。我相信他想要在密钥下加密的CTR块。但我可能错了。你是说流密钥?将密文与明文进行异或运算,就得到了。如何从key和iv中获取密文?哦,你没有明文。我明白了,生成一个完全由0x00字节组成的明文,其长度与您需要的长度相同,并对其进行加密以获取流密钥。其中一个基类有一个
GetNextIV
。但我认为这不是你想要的。我认为它会生成一个新的IV,并且不会提供密码状态下使用的下一个IV。看,例如,@Marteen-我喜欢标题的变化,但我不确定其中的一些变化是否有意义。加密前后密钥相同。获取加密的CTR块没有帮助,因为他无法增加加密的块。我相信他想要在密钥下加密的CTR块。但我可能错了。如何处理16位的00值?encryptoin方法采用字符串而不是十六进制值,如果我将“000000000000000”作为字符串传递,它将转换为十六进制表示的0x303030,并将被XORD,并给出错误的最终键???是的,您需要
00
字节值。只需将它们指定为十六进制,并在使用前解码即可。或者,这是一个C++问题——如<代码> \ \x00 \x00(ETC)“< /代码>或字符数组,如:<代码> { 0, 0 }…} /<代码>或<代码> MyStuts<代码>使用<代码> 0代码>作为值或…谢谢。事实证明,使用anyvalue可以完成这项工作。我用相同的字符串对加密后的结果值进行了异或运算,得到了密钥。因为双异或将返回原始值,只要您事先知道原始值,同样有效。如何处理16位00值?encryptoin方法采用字符串而不是十六进制值,如果我将“000000000000000”作为字符串传递,它将转换为十六进制表示的0x303030,并将被XORD,并给出错误的最终键???是的,您需要
00
字节值。只需将它们指定为十六进制,并在使用前解码即可。或者,这是一个C++问题——如<代码> \ \x00 \x00(ETC)“< /代码>或字符数组,如:<代码> { 0, 0 }…} /<代码>或<代码> MyStuts<代码>使用<代码> 0代码>作为值或…谢谢。事实证明,使用anyvalue可以完成这项工作。我用相同的字符串对加密后的结果值进行了异或运算,得到了密钥。因为双异或将返回同样有效的原始值Yep,只要您事先知道原始值。