Android 4.2 сломал мой код шифрования / дешифрования, и предоставленные решения не работают
Прежде всего, ямы уже видели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 Strings, я думаю).
Это имеет отношение к семени? Имеет ли он минимальную / максимальную длину, ограничение символов и т. Д.?
Любая идея / решение?
РЕДАКТИРОВАТЬПосле многих испытаний я вижу, что есть 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+?