在C中使用libgcrypt的密钥派生

时间:2013-01-29 13:10:47

标签: c cryptography aes libgcrypt

我正在开发一个执行aes256-cbc文件加密的简单软件。该软件使用libgcrypt-1.5.0在GNU / Linux上开发。

我想将上述函数与GCRY_KDF_PBKDF2 algoSHA512一起用作subalgo。

gcry_kdf_derive( const void *passphrase, size_t passphraselen, int algo, int subalgo,
                 const void *salt, size_t saltlen, unsigned long iterations, 
                 size_t keysize, void *keybuffer )

此函数从passphrase派生一个键。 keysize以八位字节为单位提供所需的密钥大小。 keybuffer是调用者提供的缓冲区,在成功时使用派生密钥填充。输入密码取自passphrasealgo是passphraselen八位字节的任意内存缓冲区。 subalgo指定要使用的KDF算法;见下文。 salt指定KDF算法在内部使用的算法;这通常是一种哈希算法,但某些KDF算法可能会以不同的方式使用它。根据大多数KDF算法的需要,iterations是长度为八位字节的盐。 salt是大多数KDF的正整数参数。

我不了解如何使用这个功能的三件事:

  1. saltlen必须随机生成,因此必须加密到输出文件中,不是吗? (IV-密文SALT-MAC)
  2. {{1}}有一个正确的“加密”值或者我可以选择我喜欢的任何内容吗?喜欢10,20,30 ......
  3. keysize(在这种情况下)必须是512,对吧?

2 个答案:

答案 0 :(得分:2)

  

1)salt必须随机生成,因此必须将其加密到输出文件中,不是吗? (IV-密文SALT-MAC)

正确,虽然更合乎逻辑的形式是某种容器格式的SALT-IV-CIPHERTEXT-MAC。这将是另一方需要组件

的顺序
  1. 计算密钥
  2. 验证数据
  3. 解密数据
  4.   

    2)saltlen有一个正确的“加密”值或者我可以选择我喜欢的任何东西吗?像10,20,30 ......

    最低限度(对于高度安全的系统)将是64位或8字节,但由于您使用的是高端加密原语,为什么不选择256位安全随机,以匹配您的密钥大小。

      

    3)keysize(在这种情况下)必须是512,对吗?

    这是正确的,位的密钥大小必须为512.API期望KEYSIZE参数为八位字节,因此为64个八位字节。您似乎想要执行MAC签名/验证。这需要与用于加密/解密的密钥分开的密钥。因此,您需要两个 256位密钥,幸运的是,它与SHA-512算法的输出相匹配。我说“幸运的是”因为你真的不希望PBKDF2计算另一个块 - 它会再次经历所有迭代。

    最好单独计算IV值,并将其放在密文的前面。您应该在MAC计算中包含IV值(否则将不会验证第一个纯文本块)。 IV应该是一个随机数据块,因此AES的安全随机数据为128位或16字节。

答案 1 :(得分:0)

1)Salt值是非机密的,可以与加密数据一起存储。他们所做的只是将加密值混杂在一起,以便使用GCRY_KDF_PBKDF2和SHA512加密单词“the”的密码“cat”并不总是产生密文“86c8z385a33146b59d”,或者其他什么。这可以使用rainbow tables防止攻击。您可以将其放在加密文件中,但它作为元数据更有用。

2)我认为这不重要。任何你想要的。虽然以硬盘的价格,将彩虹表的大小乘以8并不荒谬。所以你可能想要多个字节。

3)是的,因为你使用的是SHA-512,你的密钥大小是512.

此外,由于我不是真正的亲密朋友,你可能想要拍摄所有这些(戴太阳眼镜)with a grain of salt.