Прежде всего, я уже видел 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 изменился с 1,34 до 1,45 в Android 2.2 (API 8) → Android2.3 (API 9), поэтому проблема дешифрования, которую я ранее сказал, такая же, как описано здесь: Ошибка BouncyCastle AES при обновлении до 1.45
Итак, теперь вопрос: есть ли способ восстановить данные, зашифрованные в BouncyCastle 1.34, в BouncyCastle 1.45 +?