生成包含a-Z0-9的给定长度的AES密钥

时间:2013-08-08 07:43:41

标签: java encryption aes

是否可以使用AES创建一个密钥但是具有给定的长度并且它应该仅包含0-9a-Z?

我只需要一个32个字符的密钥作为SecretKey规范:(用于AES256加密/去除

2 个答案:

答案 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。我的意思是,蛮力通常以字母数字字符开头。你只是让你的钥匙在那里破裂成熟。

和ONTOP OF THAT ..

AES密钥定义为128, 192 or 256位。这是标准。你不能改变长度。您可以做的是查看Rijndael,这是AES成为标准之前的内容。这可以接受更广泛的关键值。

AND ONTOP OF THAT

密钥计划生成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());