是否可以使用AES创建一个密钥但是具有给定的长度并且它应该仅包含0-9a-Z?
我只需要一个32个字符的密钥作为SecretKey规范:(用于AES256加密/去除
答案 0 :(得分:3)
是否可以使用AES创建一个密钥但是具有给定的长度并且它应该仅包含0-9a-Z?
是的。通过生成AES密钥值,然后确保每个字符的ascii值在0-8 (48 - 57)
或a-z (97-122)
的范围内..如果不是,则只需将值修改为范围。
<强>可是.. 强>
这会成为一个非常不安全的密钥。通过如此严格限制您的价值,您实际上限制了可能的组合数量。通常情况下,它是2^256
可能的组合(此时被认为是安全的),你可以将它们组合得更少......这是不安全的。
另外,我建议的上述算法会产生大量的重复值。你要比较差异,然后进行修改,直到差异为0 ..这意味着:
For any value < the desired value.
round value to desired value.
Let desired value = 100;
Let any value = 50;
50 --> 100;
Let any value = 60;
60 --> 100;
然后......
Brute Force Attack通常会通过测试aaaa... x 256
开始。然后是(aaaa x 255) 1
。我的意思是,蛮力通常以字母数字字符开头。你只是让你的钥匙在那里破裂成熟。
AES密钥定义为128, 192 or 256
位。这是标准。你不能改变长度。您可以做的是查看Rijndael,这是AES成为标准之前的内容。这可以接受更广泛的关键值。
密钥计划生成AES密钥,原因如此。 设计对密码分析具有加密抗性。搞乱这一点,就会损害整个算法的安全性,因此当你要弄乱输出时,实现加密标准就毫无意义了。
您希望输出长度为32个字符。在ASCII中,这意味着每个字符8 bits
。或32 x 8 = 256
。嗯.. AES的推荐模式是256 bits
,所以你很幸运。您可以使用散列算法生成应该在a-z0-9
范围内的值。
答案 1 :(得分:0)
AES-256
密钥长度为256位,并且太大而无法存储为32个字符(0-9a-Z)。
但是,如果您通过扩展2个字符的字符集(总共64个)来放宽您的要求 - 那么您可以在一个字符中存储6位密钥 - 然后允许您存储192位AES密钥为32个字符。
下面的代码将创建一个32位字符的base64编码字符串(0-9a-Z + /)的192位AES密钥:
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(192);
SecretKey key = keyGen.generateKey();
String keyBase64 = Base64.encode(key.getEncoded());