gpt4 book ai didi

c - c中的openssl aes_128_ctr

转载 作者:行者123 更新时间:2023-11-30 15:08:16 24 4
gpt4 key购买 nike

我有一个1MB大小的数据,想使用aes_128_ctr来加密。我在openssl中找到了源代码如下。

/* The input encrypted as though 128bit counter mode is being
* used. The extra state information to record how much of the
* 128bit block we have used is contained in *num, and the
* encrypted counter is kept in ecount_buf. Both *num and
* ecount_buf must be initialised with zeros before the first
* call to AES_ctr128_encrypt().
*/
void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
const unsigned long length, const AES_KEY *key,
unsigned char counter[AES_BLOCK_SIZE],
unsigned char ecount_buf[AES_BLOCK_SIZE],
unsigned int *num) {

unsigned int n;
unsigned long l=length;

assert(in && out && key && counter && num);
assert(*num < AES_BLOCK_SIZE);

n = *num;

while (l--) {
if (n == 0) {
AES_encrypt(counter, ecount_buf, key);
AES_ctr128_inc(counter);
}
*(out++) = *(in++) ^ ecount_buf[n];
n = (n+1) % AES_BLOCK_SIZE;
}

*num=n;
}

我的问题是:为了加密整个1MB数据,我是否需要使用while循环来加密每个128位?我可以通过将长度设置为 (1024 * 1024/16) 来调用此函数一次吗?我不明白这个 *num 是做什么的。有人可以帮我解释一下吗?

最佳答案

您可以一次性完成。因此,首先初始化 AES_KEY key (用于加密),然后在加密之前执行 memset(ecount_buf,0,AES_BLOCK_SIZE);unsigned int num=0; 并用以下内容填充计数器缓冲区文件的计数器值。

然后调用AES_ctr128_encrypt(in,out,length, &key,counter,ecount_buf,&num);其中 length 是以字节为单位的长度,因此 1024 * 1024

如果稍后将数据附加到文件中,您可以继续使用此调用后的 counterecount_buf 值和 num 值。这些值都在函数内部工作期间被修改。

之所以需要它们,是因为如果您要在计数器模式下加密 15 个字节,并希望稍后添加另外 15 个字节,那么您仍然需要用于前 15 个字节的加密计数器值来加密第 16 个字节( block 尚未用完),因此在第一次加密后 num 将是 15,以跟踪这一点。然后计数器被更新,加密为新值,并用于接下来的 14 个字节,并且 num 变为 14,等等。如果您永远不会向文件附加任何数据,那么 out 已准备就绪,然后在加密调用后将 numcount_buffercounter 归零,然后忘记它们。

使用算法的 EVP 接口(interface)可能不会那么困惑,它在自己的上下文中跟踪这些内容(查看 evp.h)。

关于c - c中的openssl aes_128_ctr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37498912/

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