2013-12-18 5 views
2

Я просмотрел стек, чтобы найти ответ на мою проблему, и все же ничего не получилось. То, что пытается достичь, - зашифровать XML-файл, загружаемый в ASYNCtask, а затем расшифровать его.AES Decryption ERROR: заблокирован блок блокировки Android

То, что я уже проверил:

-порождённых ключ тот же, когда encrypring и дешифрования и сохраняется в sharedpreferenced с Base64.

-IV - это то же самое, поскольку на данный момент его в статической переменной для целей тестирования.

-Cipher установлен в положение AES/CBC/PKCS5Padding

-Key установлен в AES

Ошибка появляется в decryptXml() в строке:
байт [] расшифрованных = cipher.doFinal (байт);

Im все из идей и ничего не работает. Я надеюсь, что некоторые из вас могут найти ошибку в моем коде. Спасибо за помощь!

КОД:

genetateKey()

SharedPreferences sharedPreferences = context.getSharedPreferences(GENERATED_KEY, Context.MODE_PRIVATE); 
    String keyStr = sharedPreferences.getString(GENERATED_KEY, null); 
    if (keyStr == null) { 
     final int outputKeyLength = 128; 
     SecureRandom secureRandom = new SecureRandom(); 
     KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); 
     keyGenerator.init(outputKeyLength, secureRandom); 
     SecretKey key = keyGenerator.generateKey(); 
     byte[] bytes = key.getEncoded(); 
     keyStr = Base64.encodeToString(bytes, Base64.DEFAULT); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(GENERATED_KEY, keyStr); 
     editor.commit(); 
     return key.toString(); 
    } else { 
     return keyStr; 
    } 

шифрования XML:

connection = (HttpURLConnection) url.openConnection(); 
    connection.connect(); 
    SecretKey secretKey = getSecretKey(context); 
    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getEncoded(), "AES"); 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    spec = generateIv(cipher.getBlockSize()); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, spec); 

    input = connection.getInputStream(); 
    cis = new CipherInputStream(input, cipher); 

    String FILEPATH = context.getFilesDir().getParentFile().getPath(); 
    File file = new File(FILEPATH, "/download/" + id + "/"); 
     if (!file.exists()) { 
    file.mkdirs(); 
    } 

    xmlFile = new File(FILEPATH + "/download/" + id + "/", "xmldata.xml"); 
    output = new FileOutputStream(xmlFile); 
    cos = new CipherOutputStream(output, cipher); 
    byte data[] = new byte[4096]; 
    int count; 
    while ((count = cis.read(data)) != -1) { 
     if (isCancelled()) throw new TaskCanceledException(); 
      cos.write(data, 0, count); 
      progress = -1; 
      publishProgress(); 
    } 
    if (isCancelled()) throw new TaskCanceledException(); 

дешифрование:

public String decryptXml() { 
    String data = null; 
    File file = new File(context.getFilesDir().getParentFile().getPath() + "/download/" + id + "/xmldata.xml"); 
    int size = (int) file.length(); 
    byte[] bytes = new byte[size]; 
try { 
     SecretKeySpec secretKeySpec = new SecretKeySpec(getSecretKey(context).getEncoded(), "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, DownloadBookAsyncTask.spec); 
     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); 
     bis.read(bytes, 0, bytes.length); 
     bis.close(); 
     byte[] decrypted = cipher.doFinal(bytes); 
    } 

getSecretKey():

public SecretKey getSecretKey(Context context){ 
    SharedPreferences sharedPreferences = context.getSharedPreferences(DashboardFragment.GENERATED_KEY, Context.MODE_PRIVATE); 
    String stringKey = sharedPreferences.getString(DashboardFragment.GENERATED_KEY, null); 
    byte[] encodedKey = Base64.decode(stringKey, Base64.DEFAULT); 
    return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES"); 
} 

EDIT

Добавление метода IV генератор

public AlgorithmParameterSpec generateIv(int size) throws NoSuchAlgorithmException { 
    AlgorithmParameterSpec ivspec; 
    byte[] iv = new byte[size]; 
    new SecureRandom().nextBytes(iv); 
    ivspec = new IvParameterSpec(iv); 
    return ivspec; 
} 

ответ

3

Хорошо, я нашел проблему. Причина, по которой мой код не работал, заключается в том, что я использовал CipherInputStream в своем шифровании, и я не должен был этого делать. Я также переделать весь метод дешифровки, который выглядит, как это сейчас:

byte[] wholeFileByte = null; 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
    cipher.init(Cipher.DECRYPT_MODE, key, DownloadBookAsyncTask.ivspec); 
    File file = new File(context.getFilesDir().getParentFile().getPath() + "/download/" + id + "/xmldata.xml"); 
    FileInputStream fis = new FileInputStream(file); 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    CipherInputStream cis = new CipherInputStream(fis, cipher); 
    byte data[] = new byte[4096]; 
    int count; 
    while ((count = cis.read(data)) != -1) { 
     bos.write(data, 0, count); 
    } 

    if(cis != null) 
     cis.close(); 
    if(bos != null) 
     bos.close(); 
    if(fis != null) 
     fis.close(); 

    wholeFileByte = bos.toByteArray(); 
    String kk = new String(wholeFileByte, "UTF-8"); 

Я думаю другую ошибку, что я сделал, что я использовал doFinal в расшифровке даже то Cipher сделал расшифровку уже и это было источником некоторых моих ошибок.

Благодаря @GariBN, потому что у меня поставить в нужных треков и upvote вас, когда моя репутация позволяют мне :)

+0

Рад видеть, что вы преуспели. –

1

Вы создаете IV шифровать открытый текст. Я не уверен, что вы используете тот же IV, чтобы расшифровать зашифрованный текст.

Обычно вы хотите соединить IV с зашифрованным текстом, а при расшифровке прочитайте его (первые 16 байт) и затем расшифруйте все остальные байты (шифротекст) с помощью шифрования, который был инициализирован с помощью IV, используемого для шифрование.

Например, если вы шифровать:

cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, spec); 

Во-первых, попытаться расшифровать (справа позже) с:

cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, spec); 
cipher.doFinal(bytes) 

Если вам это удастся, то проблема, вероятно, из-за несоответствующего IV, и вы можете легко ее исправить.

+0

Спасибо за помощь товарищу, но, к сожалению, когда я сделал, что я снова получил BadPaddingException: C – JakubW

+0

Пожалуйста, отправьте основной код шифрования (с использованием некоторого IV) и дешифрование, которое не работает для вас. Ваш код слишком длинный, и он содержит много нерелевантных деталей. Просто зашифруйте, а затем расшифруйте. Если проблема есть, я считаю, что могу найти ее или дать вам другой рабочий код. –

+1

Причина этой стены кода в том, что я не уверен, где проблема. Что касается методов дешифрования и шифрования, то все это там с аннотациями. Я упоминал в начале моего сообщения, что проблема возникает в decryptionXml() в строке byte [] decrypted = cipher.doFinal (bytes) ;. – JakubW

Смежные вопросы