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

Java 生成具有给定长度且包含a-Z0-9的AES密钥,java,encryption,aes,Java,Encryption,Aes,是否可以使用AES创建一个具有给定长度且仅应包含0-9a-Z的密钥 我只需要一个32个字符的密钥作为SecretKey规范:(用于AES256加密/解密选项) 是否可以使用AES创建一个具有给定长度且仅应包含0-9a-Z的密钥 它是。通过生成AES密钥值,然后确保每个字符的ascii值在0-8(48-57)或a-z(97-122)的范围内。如果不在范围内,只需将该值设置为在范围内即可 但是.. 这会使密钥变得非常不安全。通过对值进行如此严格的限制,实际上是在限制可能的组合数量。而通常情况下,可能

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

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

是否可以使用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;
用于小于所需值的任何值。
将值舍入到所需值。
设期望值=100;
设任意值=50;
50 --> 100;
设任意值=60;
60 --> 100;
在这一点上

A通常从测试
aaaa…x 256
开始。然后
(aaaa x 255)1
。我的意思是,蛮力通常从字母数字字符开始。你只是让你的钥匙在那里破裂

在这一点上。。 AES密钥定义为
128、192或256
位。这是标准。您不能更改长度。您可以做的是查看,这是AES成为标准之前的情况。这可以接受更大范围的键值

说到这里 AES密钥是由密钥计划生成的,其生成方式是有原因的。AES密钥的设计目的是以加密方式抵抗密码分析。如果弄乱了这一点,则会危及整个算法的安全性,因此,当您要弄乱输出时,实现加密标准是毫无意义的

我找不到更大的字体 您希望输出长度为32个字符。在ASCII中,这意味着每个字符
8位
。或者
32 x 8=256
。AES建议的模式是
256位
,因此您很幸运。您可以使用哈希算法生成应在
a-z0-9
范围内的值

是否可以使用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;
用于小于所需值的任何值。
将值舍入到所需值。
设期望值=100;
设任意值=50;
50 --> 100;
设任意值=60;
60 --> 100;
在这一点上

A通常从测试
aaaa…x 256
开始。然后
(aaaa x 255)1
。我的意思是,蛮力通常从字母数字字符开始。你只是让你的钥匙在那里破裂

在这一点上。。 AES密钥定义为
128、192或256
位。这是标准。您不能更改长度。您可以做的是查看,这是AES成为标准之前的情况。这可以接受更大范围的键值

说到这里 AES密钥是由密钥计划生成的,其生成方式是有原因的。AES密钥的设计目的是以加密方式抵抗密码分析。如果弄乱了这一点,则会危及整个算法的安全性,因此,当您要弄乱输出时,实现加密标准是毫无意义的

我找不到更大的字体
您希望输出长度为32个字符。在ASCII中,这意味着每个字符
8位
。或者
32 x 8=256
。好吧..AES建议的模式是
256位
,所以您很幸运。您可以使用哈希算法,该算法将生成的值应在
a-z0-9
的范围内密钥长度为256位,太大,无法存储在32个字符(0-9a-Z)中

但是,如果您通过将字符集扩展为2个字符(总共64个字符)来稍微放宽您的要求,那么您可以在一个字符中存储密钥的6位,这样您就可以在32个字符中存储192位AES密钥

下面的代码将创建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());

AES-256
密钥长度为256位,太大,无法存储在32个字符(0-9a-Z)中

但是,如果您通过将字符集扩展为2个字符(总共64个字符)来稍微放宽您的要求,那么您可以在一个字符中存储密钥的6位,这样您就可以在32个字符中存储192位AES密钥

下面的代码将创建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());

我将生成一个
floor(n*5.95419)-6的键