8

Java で文字列を暗号化/復号化しようとしています。暗号化に関する問題はなく、sqlite テーブルに保存されます。しかし、復号化しようとすると常に同じエラーが発生します。

「java.security.InvalidKeyException : 予期されるときに IV が設定されていません」

ここに私のコードスニペットがあります:

public String encrypt(String password){
    try
    {
        String key = "mysecretpassword";
        SecretKeySpec keySpec = null;
        keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
        return new String(cipher.doFinal(password.getBytes()));
    }
    catch (Exception e)
    {
        return null;
    }
}

public String decrypt(String password){
    try
    {
        String key = "mysecretpassword";
        SecretKeySpec keySpec = null;
        keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        cipher.init(Cipher.DECRYPT_MODE,keySpec);
        return new String(cipher.doFinal(password.getBytes()));
    }
    catch (Exception e)
    {
        System.out.println(e);
        return null;
    }
}

私は何を間違っていますか?

4

2 に答える 2

10

cipher.init() メソッドで初期化ベクトルを指定する必要があります。

IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE,keySpec, ivSpec);

参照: http://docs.oracle.com/javase/1.5.0/docs/api/javax/crypto/spec/IvParameterSpec.html

初期化ベクトルは、ランダムなバイト配列である必要があります。詳細については、次を参照してください。

http://en.wikipedia.org/wiki/Initialization_vector

于 2012-11-06T15:19:50.500 に答える
1

適切な AES キーが必要です。次を試してください。

 String key = "mysecretpassword";
 KeySpec spec = new PBEKeySpec(key.toCharArray(), Salt, 12345678,256);
 SecretKey encriptionKey = factory.generateSecret(spec);
 Key encriptionKey = new SecretKeySpec(encriptionKey.getEncoded(), "AES");
于 2012-11-06T15:14:38.020 に答える