2

我正在寻找 Polarssl AES 计数器模式的示例。到处都找不到。

对于像我这样的初学者来说,文档很难理解。它在polarssl中定义为

int     aes_crypt_ctr (aes_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[16], unsigned char stream_block[16], const unsigned char *input, unsigned char *output)

我是这样写的

aes_context aes;

unsigned char key[32];
unsigned char iv[16];

unsigned char input [128]="Hello";
unsigned char output[128];

size_t input_len = 40;
size_t output_len = 0;

aes_setkey_enc(&aes, key, 128);


aes_crypt_ctr (&aes, 64, size_t *nc_off, unsigned char nonce_counter[16], unsigned char stream_block[16], input, output);

我无法理解加密调用中的某些参数。我正在寻找一个最小的工作示例。

4

1 回答 1

1

计数器模式 (CTR) 与 CBC 等模式不同,因为它可以在不完整的块上工作。如果您在不完整的块上使用 CBC,它通常会被填充,然后加密流已经结束。您不能在最后添加数据。

CTR 在 PolarSSL 中更多地意味着和实现为流密码,并允许您在最后添加额外的数据。因此,它现在需要知道它在当前块内的“位置”(nc_off)。

所以你应该做的是:

  1. 为了清楚起见,重命名ivnonce_counter
  2. 添加size_t nc_offset = 0;到顶部。
  3. 添加unsigned char stream_block[16];到顶部。
  4. 在 nonce_counter 中放入一个随机值(这是您的 nonce + nonce 中的计数器)使用 CTR-DRBG 之类的东西。您可以查看这篇关于在代码中添加随机生成器的文章
  5. 如果你想打一个电话:ret = aes_crypt_ctr(&aes, input_len, &nc_off, nonce_counter, stream_block, input, output);

注意:在对 的调用结束时aes_crypt_ctr(), nc_off 将为40 % 16 = 8 ,这表明如果您决定向流中添加额外数据,则仍有 8 个字节stream_block可以使用。aes_crypt_ctr()

于 2013-12-29T11:42:31.437 回答