Polarssl AES计数器模式示例

时间:2013-12-28 03:05:57

标签: linux gcc encryption aes polarssl

我正在寻找Polarssl AES计数器模式的示例。无法在任何地方找到它。

对于像我这样的初学者来说,

Documentation很难理解。它在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);

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

1 个答案:

答案 0 :(得分:1)

计数器模式(CTR)与CBC等模式不同,因为它可以在非完整块上运行。如果您在非完整块上使用CBC,则通常会对其进行填充,然后加密流可用于所有目的。您无法在最后添加数据。

CTR在PolarSSL中更有意义并作为流密码实现,并允许您在最后添加其他数据。因此,它现在需要在当前块(nc_off)内的“位置”。

所以你应该做的是:

  1. 为了清楚起见,将iv重命名为nonce_counter
  2. size_t nc_offset = 0;添加到顶部。
  3. unsigned char stream_block[16];添加到顶部。
  4. 在nonce_counter中放置一个随机值(这是nonce中的nonce + counter)使用类似CTR-DRBG的内容。您可以查看article on adding a random generator to your code
  5. 如果您想拨打一个电话:ret = aes_crypt_ctr(&aes, input_len, &nc_off, nonce_counter, stream_block, input, output);
  6. 注意:在致电aes_crypt_ctr()时,nc_off将位于 40%16 = 8 ,表示还剩8个字节stream_blockaes_crypt_ctr()可以使用{{1}},如果您决定向流中添加额外数据。