gpt4 book ai didi

c - 在 C 中使用 libgcrypt 进行 key 派生

转载 作者:太空宇宙 更新时间:2023-11-03 23:31:22 25 4
gpt4 key购买 nike

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

我想将上述函数与 GCRY_KDF_PBKDF2 作为 algoSHA512 作为子算法一起使用。

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 )

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

关于如何使用此功能,我不明白三件事:

  1. salt 必须随机生成,所以它必须 加密到输出文件中,不是吗? (IV-密文-SALT-MAC)
  2. saltlen 有一个正确的“crypto”值,或者我可以选择我喜欢的任何值吗?像 10、20、30...
  3. keysize(在本例中)必须是 512,对吗?

最佳答案

1) salt must be generate randomly so it must be put not encrypted into the output file, isn't it? (IV-CIPHERTEXT-SALT-MAC)

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

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

2) saltlen has a correct "crypto" value or can i choose whatever i prefer? Like 10,20,30...

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

3) keysize (in this case) must be 512, right?

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

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

关于c - 在 C 中使用 libgcrypt 进行 key 派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14583733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com