Android AES блок шифрования поврежден блок - PullRequest
3 голосов
/ 12 апреля 2011

Я использую методы ниже, и если я ввожу правильную клавишу, все работает отлично. Но если я ввожу неправильный ключ, я получаю BadPaddingException: блок pad поврежден ... Я делаю что-то неправильно?

public  void initKey(String passwd, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException{

    byte[] localsalt = salt; 
   PBEKeySpec password = new PBEKeySpec(passwd.toCharArray(),localsalt, 1024,128);//, localsalt, 1000, 128);  //128bit enc aes
   SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithMD5And128BitAES-CBC-OpenSSL","BC");  
   PBEKey key = (PBEKey) factory.generateSecret(password);  
   encKey = new SecretKeySpec(key.getEncoded(), "AES");
}


public   String txt2enc(String etxt) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {

       final Cipher cipher = Cipher.getInstance("AES");//AES       
       cipher.init(Cipher.ENCRYPT_MODE, encKey);      

       byte[] encrypted = cipher.doFinal((etxt).getBytes("UTF-8"));
       return Base64.encodeToString(encrypted, 0);
}

//decryption
public  String txt2dec(String dtxt) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException{

    final Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, encKey);
    byte[] decrypt = cipher.doFinal(Base64.decode(dtxt, 0));
    return new String(decrypt);//return Base64.encodeToString(decrypt, 0);
}

Ответы [ 2 ]

5 голосов
/ 13 апреля 2011

Вы не делаете ничего плохого.Это ожидается.Технически это является дубликатом проблемы Java Encryption (которую, кажется, нелегко найти).См. ответ для хорошего объяснения.Вы можете добавить MAC (код аутентификации сообщения) для безопасного выполнения чего-то большего, чем контрольная сумма.

0 голосов
/ 12 апреля 2011

Кроме предоставления неправильного ключа, я так не думаю:)

Трассировка стека может помочь, чтобы мы могли видеть, какая функция вызывает исключение BadPaddingException.

Это вполне можетбыть потому что «плохой» ключ имеет длину, отличную от «хорошего» ключа - «плохой» ключ получается из initKey () или где-то еще?

С наилучшими пожеланиями,

ФилLello

...