gpt4 book ai didi

java - AES:如何为每个算法大小从密码生成 key

转载 作者:行者123 更新时间:2023-11-29 06:09:23 26 4
gpt4 key购买 nike

是否可以编写一种方法,根据 AES-128、AES-192 和 AES-256 的密码生成有效 key ?

我的想法是这样的:

    SecretKeyFactory f;
try {
f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
} catch (NoSuchAlgorithmException e) {
throw new Exception("Key derivation algorithm not available.", e);
}
KeySpec ks = new PBEKeySpec(password.toCharArray());
SecretKey s;
try {
s = f.generateSecret(ks);
} catch (InvalidKeySpecException e) {
throw new Exception("Key generation failed.", e);
}
Key k = new SecretKeySpec(s.getEncoded(),"AES");

我使用类似的方法为 AES-256 生成加盐 key 。但是,现在我必须只从密码生成 key (没有加盐也没有迭代),我需要它们适用于 AES-128、AES-192 和 AES-256。我的问题是,此代码返回的 key 是否与每个 AES-XXX 大小兼容,还是我应该为每个大小编写不同的代码?

此外,是否有更好的(在安全性或简单性方面)从密码生成 key 的方法?

更新:最后我做了一些测试,结果是这个构造函数:

KeySpec ks = new PBEKeySpec(password.toCharArray());

始终在此 block 上抛出 InvalidKeySpecException:

try {
s = f.generateSecret(ks);
} catch (InvalidKeySpecException e) {
throw new Exception("Key generation failed.", e);
}

所以我坚持使用另一个构造函数,它需要一个盐作为参数:

KeySpec ks = new PBEKeySpec(password.toCharArray(), "somepredefinedsalt".getBytes(), numIters, keySizeInBits);

因为我没有盐,所以我想到了对预定义的进行硬编码。现在我不知道哪个选项更安全,编码预定义的盐并使用 PBKDF2 或使用截断的哈希。

最佳答案

如果可以,请不要那样做。用户选择的密码通常熵很差

如果“密码”不是用户选择的,而是由加密强 RNG 生成的,则使用密码或密码的哈希值。在这种情况下,您不需要 PBKDF2。

PBKDF2 确实是不得已的解决方案。

另请阅读 Lessons learned and misconceptions regarding encryption and cryptology

关于java - AES:如何为每个算法大小从密码生成 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7467798/

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