gpt4 book ai didi

cryptography - libgcrypt 如何为 CTR 模式增加计数器?

转载 作者:行者123 更新时间:2023-12-04 04:22:47 25 4
gpt4 key购买 nike

我有一个使用 libgcrypt 的 CTR 模式实现用 AES-256 加密的文件。
我希望能够分部分解密文件(例如,在不解密整个文件的情况下解密 20 个块中的 5-10 个块)。

我知道通过使用 CTR 模式,我应该能够做到。我所需要的只是知道正确的计数器。
问题在于我所拥有的只是块 0 的初始计数器。例如,如果我想解密块 5,我需要另一个计数器,这是通过对从 0 开始的每个块的初始计数器执行一些操作来实现的到 5。

我似乎找不到 libgcrypt 公开的 API,以便在给定初始计数器的情况下计算后面块的计数器。

给定块#0的计数器,如何计算后面块(例如块#5)的计数器?

最佳答案

如有疑问,请转至 the source .这是 gcrypt 的通用 CTR 模式实现( _gcry_cipher_ctr_encrypt() in cipher-ctr.c )中增加计数器的代码:

for (i = blocksize; i > 0; i--)
{
c->u_ctr.ctr[i-1]++;
if (c->u_ctr.ctr[i-1] != 0)
break;
}

在 libgcrypt 源代码的其他地方,还有其他更优化的计数器递增实现,例如在各种特定于密码的快速批量 CTR 加密实现中,但这种通用的恰好很好且可读。 (当然,所有这些替代实现无论如何都需要产生相同的计数器值序列,以便 gcrypt 与自身保持兼容。)

好的,那么它实际上是做什么的呢?

好吧,查看上下文(或更具体地说, cipher-internal.h ),很明显 c->u_ctr.ctrblocksize 的数组无符号字节(其中 blocksize 等于 AES 的 16 个字节)。上面的代码将其最后一个字节增加一,并检查结果是否回绕为零。如果没有,它就会停止;如果它确实换行,则代码然后移动到倒数第二个字节,递增它,检查它是否被换行,并继续循环直到它找到一个在递增时不回绕的字节,或者它已经递增所有的 blocksize字节。

因此,例如,如果您的原始计数器值是 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ,然后在递增后它会变成 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} .如果再次增加,它将变成 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2} ,然后 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3} ,等等直到 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255} ,之后下一个计数器值将是 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0} (然后是 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2}{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3} 等)。

当然,这实际上只是在算术上递增单个( blocksize × 8)位整数,存储在内存中 big-endian字节顺序。

关于cryptography - libgcrypt 如何为 CTR 模式增加计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53950006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com