是否可以使用 AES 创建一个具有给定长度的密钥,并且它应该只包含 0-9a-Z?
我只需要一个 32 个字符的密钥作为 SecretKey 规范 :( 用于 AES256 加密/解密
是否可以使用 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;
最重要的是..
蛮力攻击通常从测试开始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
.
密钥长度为AES-256
256 位,并且太大而无法存储 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());