2

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

我想将上述函数与GCRY_KDF_PBKDF2asalgoSHA512as 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 )

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

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

  1. salt必须随机生成,因此必须将其加密放入输出文件中,不是吗?(IV-密文-SALT-MAC)
  2. saltlen有一个正确的“加密”值还是我可以选择我喜欢的任何东西?比如 10,20,30...
  3. keysize(在这种情况下)必须是 512,对吧?
4

2 回答 2

2

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

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

  1. 计算密钥
  2. 验证数据
  3. 解密数据

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 字节的安全随机数据。

于 2013-01-29T23:54:32.197 回答
0

1)值是非秘密的,可以与加密数据一起存储。他们所做的一切都是混淆加密值,因此使用 GCRY_KDF_PBKDF2 和 SHA512 加密单词“the”的密码“cat”并不总是产生密文“86c8z385a33146b59d”或其他任何内容。这可以防止使用彩虹表的攻击。您可以将其放在加密文件中,但它作为元数据更有用。

2)我认为这不重要。无论你想要什么。尽管以硬盘驱动器的价格,将彩虹表的大小乘以 8 并不可笑。所以你可能需要一个以上的字节。

3)是的,因为您使用的是 SHA-512,所以您的密钥大小是 512。

此外,由于我不是一个真正的密码爱好者,你可能想对所有这些(戴上太阳镜)持保留态度

于 2013-01-29T14:54:49.177 回答