AES256 Libgcrypt密钥长度无效

时间:2017-08-24 08:38:06

标签: c aes libgcrypt

我尝试使用libgcrypt中的AES256加密和解密文件。 (见doc

要生成256位密钥,我用SHA256对用户定义的字符串(argv[1])进行哈希处理。这非常合适,但当使用它作为键时,库会因Invalid key length而失败。

请参阅下面的代码段:

gcry_md_hd_t hd; 
gcry_md_open(&hd, GCRY_MD_SHA256, GCRY_MD_FLAG_SECURE);

gcry_md_write(hd, argv[1], strnlen(argv[1], P_DIARY_MAXPWDLEN));
unsigned char * hash = gcry_md_read(hd, GCRY_MD_SHA256);

gcry_cipher_hd_t cipher;
gcry_cipher_open(&cipher, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC, GCRY_MD_FLAG_SECURE);
gcry_cipher_setkey(cipher, hash, 256);

我是否必须使用空终止字符串?我不想为哈希分配更多的内存(这可能是空字节所需要的),因为它应该放在SECUREMEM中。

1 个答案:

答案 0 :(得分:2)

好的,我发现了我的错误:
gcry_cipher_setkey()期望长度以字节为单位,因此32而不是256。

来自doc

  

功能:gcry_error_t gcry_cipher_setkey (gcry_cipher_hd_t h, const void *k, size_t l)

     

[...]密钥l的长度k(以字节为单位)必须与为此上下文设置的算法所需的长度匹配,或者在具有变量密钥的算法的允许范围内尺寸。该函数检查此项并在出现问题时返回错误。调用者应始终检查错误。