StringAES_MODE=KeyProperties.KEY_ALGORITHM_AES+"/"+KeyProperties.BLOCK_MODE_CBC+"/"+KeyProperties.ENCRYPTION_PADDING_PKCS7;KeyStoreAndroidKeyStore=AndroidKeyStore.getInstance("AndroidKeyStore");// byte[] inputKeykey=AndroidKeyStore.getKey(keyAlias,null);Ciphercipher=Cipher.getInstance(AES_MODE);cipher.init(Cipher.ENCRYPT_MODE, key);byte[]encryptedBytes=cipher.doFinal(input);byte[]iv=cipher.getIV();// save both the IV and the encryptedBytes
IV (初期化ベクトル) および暗号化されたバイト列の両方を保存する必要があります。そうしないと復号はできません。
暗号文を復号する方法を以下に示します。 input は暗号化されたバイト配列であり、 iv は暗号ステップからの初期化ベクトルです。
IV は毎回ランダムに生成されるため、後で復号するために暗号文 (encryptedBytes) とともに保存する必要があります。
対称暗号鍵は Password Based Key Derivation Function version 2 (PBKDF2) を使用してパスフレーズから生成できます。この暗号プロトコルは暗号鍵を生成するように設計されており、暗号化の目的で使用できます。アルゴリズムの入力パラメータは 脆弱な鍵生成関数 セクションに従って調整します。以下のコードはパスワードに基づいて強力な暗号鍵を生成する方法を示しています。
public static SecretKey generateStrongAESKey(char[] password, int keyLength)
{
//Initialize objects and variables for later use
int iterationCount = 10000;
int saltLength = keyLength / 8;
SecureRandom random = new SecureRandom();
//Generate the salt
byte[] salt = new byte[saltLength];
random.nextBytes(salt);
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, iterationCount, keyLength);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
return new SecretKeySpec(keyBytes, "AES");
}