当前位置: 首页 > 知识库问答 >
问题:

密钥长度对输出长度的影响

楚博雅
2023-03-14

考虑以下java代码:

KeySpec spec = new PBEKeySpec("pass".toCharArray(), "salt".getBytes(),
    10000, 512);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
System.out.println(f.generateSecret(spec).getEncoded().length);

此代码输出“64”。所以是64字节,而SHA-256是32字节哈希。

我知道我指定了512位(64字节)作为密钥长度
然而,我希望生成的密钥(PBKDF2)将由SHA-256进行散列,这样无论我使用的密钥大小如何,输出都应始终为32字节。

我错过了什么(或者为什么我的期望是错误的)?

共有1个答案

湛铭
2023-03-14

我们可以将PBKDF写入DK=PBKDF2(PRF,密码,盐, c, dkLen)

  • PRF是输出长度为hlen
  • 的伪随机函数
  • dkLen是派生密钥的所需位长度
  • 'c'是迭代次数

如何计算;

DK = T1 ‖ T2 ‖ ... ‖ T_{dklen/hlen}

其中< code>Ti = F(Password,Salt,c,i)并且每个都有< code>hlen个大小。

F(Password, Salt, c, i) = U1 ⊕ U2 ⊕ ... ⊕ Uc

U1 = PRF(Password, Salt + INT_32_BE(i))
U2 = PRF(Password, U1)
...
Uc = PRF(Password, Uc-1)

dklen最多可以是后端哈希(PRF)输出大小的2^32-1倍。

正如您所看到的,只需对salt进行少量修改,32位编码值为i,PBKDF2就可以输出多个hlen输出。

 类似资料:
  • 我被要求为安全类实现AES算法。在实现过程中,我找不到答案,我如何从用户那里接受像密码这样的任意长度的密钥,并将其转换为128、192或256位密钥。我该怎么办?

  • 我正在学习ssl通信的基础知识,尤其是AES加密。我读了OpenSSL代码,看到了一个名为< code>userkey的指针。 在文件"aes_core. c"中 > 从何而来?它是如何生成的? 我想知道不同版本AES的的实际大小。 256 位版本为 256 / 8 = 32,192 为 24,128 为 16?我有点迷茫。 如果长度是可变的,那么我应该如何为那些符合长度要求的输入创建一个安全的输

  • 问题内容: 我无法在上创建索引。 MySQL: 问题答案:

  • 问题内容: 当我执行以下命令时: 我收到此错误消息: 有关column1和column2的信息: 我认为只需要21个字节,而只需要501个字节。因此,总字节数是522,少于767。那么为什么收到错误消息? 问题答案: 在MySQL版本5.6(及更早版本)中,InnoDB表的前缀限制为767个字节。MyISAM表的长度为1,000字节。在MySQL 5.7及更高版本中,此限制已增加到3072字节。

  • 问题内容: 此代码给出了无效的AES密钥长度错误。我该如何纠正?(我想要128位密钥AES加密) 任何帮助表示赞赏 问题答案: 使用a 从密码派生密钥字节。您可以在此处查看详细示例。请注意,您需要指定128位密钥的密钥长度,而不是该示例中所示的256位。 您将遇到的下一个问题是您没有指定填充方案。除非您的消息是16字节(AES块大小)的倍数,否则将引发错误。如示例所示,使用PKCS5Padding

  • 问题内容: Python提供了一种很好的方法来获取渴望的迭代的长度。但是对于以生成器理解和函数表示的惰性可迭代对象,我找不到类似的东西。当然,编写类似以下内容并不难: 但是我无法摆脱自己重新设计自行车的感觉。 (当我键入函数时,我想到了一个想法:也许确实没有这样的函数,因为它“破坏了”其参数。不过,对于我的情况而言,这不是问题)。 PS:关于第一个答案-是的,类似的方法也可以工作,但是会大大增加内