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+?

Ответы на вопрос(7)

Ваш ответ на вопрос