我目前正在尝试加密和解密java String。为此,我写了下面两种方法:
public static String AESencryptString(String clearStr) throws Exception {
String cipherStr = null;
//génération de la clé de cryptage AES
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec spec = new PBEKeySpec(KEY.toCharArray());
Log.d("test", ""+ spec);
SecretKey tmp = factory.generateSecret(spec);
SecretKey key = new SecretKeySpec(tmp.getEncoded(), "AES");
//cryptage du mot de passe
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherByteArray = cipher.doFinal(clearStr.getBytes("UTF-8"));
//convertion du mot de passe en String pour l'enregistrement en base
cipherStr = new String(Base64.encode(cipherByteArray, 0));
return cipherStr;
}
public static String AESdecryptString(String cipherStr) throws Exception {
String clearStr = null;
//génération de la clé de cryptage AES
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(KEY.toCharArray());
SecretKey tmp = factory.generateSecret(spec);
SecretKey key = new SecretKeySpec(tmp.getEncoded(), "AES");
//décryptage du mot de passe
Cipher decipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
decipher.init(Cipher.DECRYPT_MODE, key);
byte[] clearByteArray = decipher.doFinal(cipherStr.getBytes());
//convertion du mot de passe en String pour l'enregistrement en base
clearStr = new String(Base64.encode(clearByteArray, 0));
return clearStr;
}
抛出的错误是" InvalidKeySpec"在factory.generateSecret - >执行期间我知道这个错误是由于缺少SALT但是,如果我只用密码创建一个PBEKeySpec,它应该有办法使用它,你能帮忙找到它吗?
我尝试使用SALT,只是为了进行测试......它不起作用,但错误不一样。在这种情况下,错误被抛出" cipher.init"我无法弄清楚这个错误是什么,因为调试器告诉我""
请帮助我,因为我会发疯!
答案 0 :(得分:1)
创建PBEKeySpec时,必须使用带有四个参数的构造函数:
PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)
注意:您可以在加密文本之前存储未加密的salt。 iterationCount可以在您的应用程序中进行硬编码。
byte[] salt = new byte[8];
new SecureRandom().nextBytes(salt);
PBEKeySpec spec = new PBEKeySpec(KEY.toCharArray(), salt, 10000, 128);
该示例使用128代表AES128,这通常就足够了。