我正在开发一个执行aes256-cbc文件加密的简单软件。该软件使用libgcrypt-1.5.0在GNU / Linux上开发。
我想将上述函数与GCRY_KDF_PBKDF2
algo
和SHA512
一起用作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
是调用者提供的缓冲区,在成功时使用派生密钥填充。输入密码取自passphrase
,algo
是passphraselen八位字节的任意内存缓冲区。 subalgo
指定要使用的KDF算法;见下文。 salt
指定KDF算法在内部使用的算法;这通常是一种哈希算法,但某些KDF算法可能会以不同的方式使用它。根据大多数KDF算法的需要,iterations
是长度为八位字节的盐。 salt
是大多数KDF的正整数参数。
我不了解如何使用这个功能的三件事:
saltlen
必须随机生成,因此必须将不加密到输出文件中,不是吗? (IV-密文SALT-MAC)答案 0 :(得分:2)
1)salt必须随机生成,因此必须将其加密到输出文件中,不是吗? (IV-密文SALT-MAC)
正确,虽然更合乎逻辑的形式是某种容器格式的SALT-IV-CIPHERTEXT-MAC。这将是另一方需要组件
的顺序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.