传递PBEKeySpec时,SecretKeyFactory generateSecret错误

时间:2014-06-26 09:44:18

标签: java android aes

我目前正在尝试加密和解密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"我无法弄清楚这个错误是什么,因为调试器告诉我""

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

1 个答案:

答案 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,这通常就足够了。