0

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

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

4

2 回答 2

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;

最重要的是..

蛮力攻击通常从测试开始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.

于 2013-08-08T07:53:08.923 回答
0

密钥长度为AES-256256 位,并且太大而无法存储 32 个字符(0-9a-Z)。

但是,如果您通过将字符集扩展为多 2 个字符(总共 64 个)来放松您的要求 - 那么您可以在一个字符中存储 6 位密钥 - 然后您可以将 192 位 AES 密钥存储在32 个字符。

下面的代码将创建一个 192 位 AES 密钥的 32 个字符的 base64 编码字符串 (0-9a-Z+/):

  KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
  keyGen.init(192); 
  SecretKey key = keyGen.generateKey();
  String keyBase64 = Base64.encode(key.getEncoded());
于 2013-08-11T20:19:47.647 回答