まず第一に、 Android 4.2 が私の AES 暗号化/復号化コード と 暗号化エラーを Android 4.2 と提供されたソリューションで破ったことを既に見てきました:
SecureRandom sr = null;
if (android.os.Build.VERSION.SDK_INT >= JELLY_BEAN_4_2) {
sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
} else {
sr = SecureRandom.getInstance("SHA1PRNG");
}
Android 4.2でAndroid <4.2で暗号化されたデータをデコードすると、次のようになるため、私には機能しません。
javax.crypto.BadPaddingException: pad block corrupted
at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:709)
私のコードは非常に単純で、Android 4.2 までは機能していました。
public static byte[] encrypt(byte[] data, String seed) throws Exception {
KeyGenerator keygen = KeyGenerator.getInstance("AES");
SecureRandom secrand = SecureRandom.getInstance("SHA1PRNG");
secrand.setSeed(seed.getBytes());
keygen.init(128, secrand);
SecretKey seckey = keygen.generateKey();
byte[] rawKey = seckey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
return cipher.doFinal(data);
}
public static byte[] decrypt(byte[] data, String seed) throws Exception {
KeyGenerator keygen = KeyGenerator.getInstance("AES");
SecureRandom secrand = SecureRandom.getInstance("SHA1PRNG");
secrand.setSeed(seed.getBytes());
keygen.init(128, secrand);
SecretKey seckey = keygen.generateKey();
byte[] rawKey = seckey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
return cipher.doFinal(data);
}
私の推測では、Android 4.2 で変更されたのはデフォルト プロバイダーだけではありません。それ以外の場合、私のコードは提案されたソリューションで動作します。
私のコードは、ずっと前に StackOverflow で見つけた投稿に基づいていました。バイト配列を暗号化および復号化するだけなので、言及された投稿とは異なることがわかりますが、他のソリューションは文字列を暗号化および復号化します(HEX文字列だと思います)。
それは種と関係がありますか?最小/最大長、文字の制限などはありますか?
アイデア/解決策はありますか?
編集:多くのテストの後、2つの問題があることがわかりました:
プロバイダーは Android 4.2 (API 17) で変更されました -> これは簡単に修正できます。投稿の冒頭で述べた解決策を適用するだけです
BouncyCastle は Android 2.2 (API 8) -> Android2.3 (API 9) で 1.34 から 1.45 に変更されたため、以前に説明した復号化の問題は、ここで説明したものと同じです: BouncyCastle 1.45 にアップグレードすると AES エラーが発生する
質問は、BouncyCastle 1.34 で暗号化されたデータを BouncyCastle 1.45+ で復元する方法はありますか?