【问题标题】:openssl aes_128_ctr in cc语言中的openssl aes_128_ctr
【发布时间】:2016-05-28 12:21:01
【问题描述】:

我有一个 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 做什么。谁能帮我解释一下?

【问题讨论】:

标签: c encryption openssl


【解决方案1】:

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

然后拨打AES_ctr128_encrypt(in,out,length, &amp;key,counter,ecount_buf,&amp;num); 其中length 是以字节为单位的长度,所以1024 * 1024

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

它们是必需的,因为如果您要在计数器模式下加密 15 个字节并想稍后再添加 15 个,那么您仍然需要用于前 15 个字节的加密计数器值来加密第 16 个字节(块还没有用完),所以在第一次加密后num 将是 15,以跟踪这一点。然后计数器被更新,加密为新值,并用于接下来的 14 个字节,num 变为 14,依此类推。如果您永远不会将任何数据附加到文件中,那么out 准备好了,然后在加密调用之后将numcount_buffercounter 归零,然后忘记它们。

改用算法的 EVP 接口可能会更容易混淆,它会在自己的上下文中跟踪这些东西(查看 evp.h)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多