生成AES密钥

1 java encryption aes

我在互联网上找到了这个:http://www.code2learn.com/2011/06/encryption-and-decryption-of-data-using.html

基本上,我想做的不是让密钥设置如此

  new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't',
'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };
Run Code Online (Sandbox Code Playgroud)

我希望它是随机的(但必须是16个字节),并且可以访问它(在屏幕上打印).还有,有没有办法将其设置为字符串,而不是字节类型?

eri*_*son 6

强AES密钥长度为16,24或32 字节.如果限制的关键,映射到可打印US-ASCII字符字节,关键是弱于预期,因为它的范围是有限的(约100位,而不是128数百万次弱).最好使用十六进制,base-64或base-85等编码将密钥表示为文本; 当然,这些陈述会更长.

要创建安全密钥,请使用KeyGenerator基于正确播种的加密随机数生成器的密钥; 如果您没有指定一个,提供商将选择自己的RNG:

KeyGenerator gen = KeyGenerator.getInstance("AES");
gen.init(128); /* 128-bit AES */
SecretKey secret = gen.generateKey();
byte[] binary = secret.getEncoded();
String text = String.format("%032X", new BigInteger(+1, binary));
System.out.println(text);
Run Code Online (Sandbox Code Playgroud)

如果需要,可以SecureRandom使用首选算法和提供程序实例化自己的实例,并通过init()方法的重载将其传递给密钥生成器.

有一些关键的派生方法试图减轻基于密码的密钥的弱点,但基于密码的密钥总是更容易预测.