【发布时间】:2019-12-11 02:35:00
【问题描述】:
每次使用 AES 更改加密值时,让任何人调查以下代码并让我知道问题
代码:
private static final String secretKeys = "58BA833E57A51CBF9BF8BAB696BF9"
public static String encrypt() throws Exception {
byte[] salt = new byte[16];
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
PBEKeySpec pbeKeySpec = new PBEKeySpec(secretKeys.getChars(),salt,1000, 256);
Key secretKey = factory.generateSecret(pbeKeySpec);
byte[] key = new byte[32];
byte[] iv = new byte[16];
SecretKeySpec secret = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
byte[] result = cipher.doFinal("welcome".getBytes("UTF-8"));
String s = Base64.getEncoder().encodeToString(result);
return s
}
输出 我第一次得到下面加密的字符串
CZRIP35M4CnJtuDQ6YpmaQ==
第二次得到下面加密的字符串
/fylTjohAZDsnCaHhiZo3A==
我有三个问题:
为什么加密的字符串不是常量?
如何设置块大小? (
AES.BlockSize = 128;)如何设置填充模式? (
AES.Padding = PaddingMode.PKCS7;)
【问题讨论】:
-
每次执行时 salt 的值是否会发生变化?
-
@Freiheit 抱歉,我不知道如何检查盐值?
-
当我打印盐值时,它显示为 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
-
您是否意识到您总是使用一个全为 0 的字节数组作为您的密钥,而前 4 行代码没有做任何事情?而且你也从不使用 iv 吗?
-
你为什么关心输出?重要的是它可以用相同的密钥解密。
标签: java encryption aes salt crypt