【发布时间】:2020-02-24 05:17:45
【问题描述】:
我正在尝试使用此代码创建 AES 密钥
public static SecretKey generateSecretKey() {
KeyGenerator generator;
try {
generator = KeyGenerator.getInstance(StaticHandler.AES_KEY_MODE); // Is "AES"
generator.init(StaticHandler.AES_KEY_SIZE); // The AES key size in number of bits // Is "128"
return generator.generateKey();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
但是使用此代码进行加密/解密
public static String encrypt(String data, SecretKey secret, Charset charset) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
return new String(cipher.doFinal(data.getBytes()), charset);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String decrypt(String data, @NonNull SecretKey secret, Charset charset) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret);
return new String(cipher.doFinal(data.getBytes()), charset);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
得到错误
java.security.InvalidKeyException: Parameters missing
我猜我需要添加一些盐,虽然我不知道如何使用生成的密钥来做到这一点。我想远离生成密码,但如果它是安全生成的密码,我不介意。
编辑:只是事后考虑,如果我通过网络发送数据包,我应该使用 GCM 还是 CBC 加密?请记住,我使用的是随机生成的密钥,我不会将它们保留在会话中,每个客户端和服务器会话随机生成。
【问题讨论】:
-
从哪一行抛出异常?
-
如果我没记错的话是 cipher.init() 方法调用。我无法在撰写本文时进行检查。
标签: java encryption cryptography