gpt4 book ai didi

java - 传递 PBEKeySpec 时 SecretKeyFactory generateSecret 错误

转载 作者:行者123 更新时间:2023-11-30 02:49:37 27 4
gpt4 key购买 nike

我目前正在尝试加密和解密 java 字符串。为此,我编写了以下 2 种方法:

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;
}

在执行 factory.generateSecret 期间抛出的错误是“InvalidKeySpec” -> 我知道这个错误是由于缺少 SALT 但是,如果我可以只用密码创建 PBEKeySpec,它应该有办法使用它,你能帮忙找到它吗?

我尝试使用 SALT,只是为了测试......它也不起作用,但错误不一样。在这种情况下,错误是在“cipher.init”上抛出的,我无法弄清楚这个错误是什么,因为调试器告诉我“”

请帮助我,因为我会发疯的!

最佳答案

创建 PBEKeySpec 时您必须使用带有四个参数的构造函数:

PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)

注意:您可以在加密文本之前存储未加密的盐。 iterationCount 可以在您的应用程序中进行硬编码。

byte[] salt = new byte[8];
new SecureRandom().nextBytes(salt);
PBEKeySpec spec = new PBEKeySpec(KEY.toCharArray(), salt, 10000, 128);

该示例对 AES128 使用 128,这通常就足够了。

关于java - 传递 PBEKeySpec 时 SecretKeyFactory generateSecret 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24427238/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com