2017-02-11 13 views
0

Привет, я искал ответы в переполнении стека. Но все это не работает. Не могли бы вы мне помочь.Как правильно преобразовать String в байт [] при шифровании/расшифровке текста в android? (Ошибки - WRONG_FINAL_BLOCK_LENGTH и IllegalBlockSizeException)

Я хотел бы сделать шифрование и расшифровку текста в android. Мне нравится делать это как можно проще. Сначала я написал код в java eclipse. Он работает нормально, но если я передам его в Android Studio, есть пара ошибок.

Я должен передать байт [] в строку, потому что я использую Firebase и это не поддерживает хранение объекта класса с байтами []

Я стараюсь работать с this hint, и многие другие, но у меня есть только неудачи.

generateKey()

private static SecretKey generateKey() throws Exception 
    { 

     SecretKey key = new SecretKeySpec(org.apache.commons.codec.binary.Hex.decodeHex(klucz.toCharArray()), "AES");   

     return key; 
    } 

шифровать (сбщ)

public String encrypt(String messageText) 
{ 
    try 
    { 
     byte[] data = messageText.getBytes("UTF-8"); 


     IvParameterSpec iv = new IvParameterSpec(iv_.getBytes("UTF-8")); 
     SecretKeySpec key = (SecretKeySpec) generateKey(); 

     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); 
     cipher.init(Cipher.ENCRYPT_MODE, key, iv); 


     byte[] textBytes = cipher.doFinal(messageText.getBytes("UTF-8")); 
     String textString = Base64.encodeToString(textBytes, Base64.DEFAULT); 

     return textString; 


    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
    } 

    return null; 
} 

расшифровывать (сбщ)

public String decrypt(String msgText) 
    { 
     try 
     { 
      byte[] data = msgText.getBytes("UTF-8"); 

      IvParameterSpec iv = new IvParameterSpec(iv_.getBytes("UTF-8")); 
      SecretKeySpec skeySpec = (SecretKeySpec) generateKey(); 

      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); 
      cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); 


      byte[] original = cipher.doFinal(data); 
      String textString = new String(original, "UTF-8"); 
      return textString; 


     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 

     return null; 
    } 

Когда я STH Li ка этого я получил ошибку:

WRONG_FINAL_BLOCK_LENGTH

Когда я пытаюсь изменить его на простой AES с

Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.DECRYPT_MODE, skeySpec); 

Я получил сообщение об ошибке:

IllegalBlockSizeException:

+0

Получаете ли вы WRONG_FINAL_BLOCK_LENGTH в расшифровке? Вы также должны показать свой полный метод дешифрования, включая код, который удаляет base64 перед расшифровкой. –

+0

Мой дешифр похож на шифрование, но я редактировал оригинальную запись. – Kainka

+0

Как и ожидалось .. ошибка - это отсутствие base64-декодирования в расшифровке .. :) –

ответ

0

Вы закодировали зашифрованную в base64 после шифрования , но вы еще не расшифровали его до дешифрования

Удалить из decrypt() это Код

byte[] data = msgText.getBytes("UTF-8"); 

И добавить

byte[] data = Base64.decode(msgText, Base64.DEFAULT); 

Примечание: не используйте AES в Cipher cipher = Cipher.getInstance("AES");. Используйте специальный режим, чтобы избежать неожиданных результатов в android.