2015-03-20 5 views
1

Мой метод шифрования является:javax.crypto.IllegalBlockSizeException возвращается при расшифровке номер кредитной карты

private static final String ALGORITHM = "AES/ECB/PKCS5Padding"; 
private static final byte[] KEY = "StBet9834#$10BCy".getBytes(); 

private String encryptCreditCard(String ccNumber) { 
    // do some encryption 
    if (ccNumber == null || ccNumber.length() == 0) { 
     return ""; 
    } 
    Key key = new SecretKeySpec(KEY, "AES"); 
    try { 
     Cipher c = Cipher.getInstance(ALGORITHM); 
     c.init(Cipher.ENCRYPT_MODE, key); 
     //return Base64.encodeBytes(c.doFinal(ccNumber.getBytes())); 
     byte[] ccNumberBytes = ccNumber.getBytes(); 
     byte[] encCCNumber = c.doFinal(ccNumberBytes); 
     return new String(Base64.encodeBase64(encCCNumber)); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

И я ниже метод расшифровки данные кредитной карты:

public void decryptCreditCard() { 
    Key key = new SecretKeySpec(KEY, "AES"); 
    try { 
    String ccNumber = this.cardNumber; 
    if (ccNumber == null || ccNumber.length() == 0) { 
     return; 
    } 
    Cipher c = Cipher.getInstance(ALGORITHM); 
    c.init(Cipher.DECRYPT_MODE, key); 
    byte[] ccENCBytes = Base64.decodeBase64(ccNumber); 
    byte[] ccDECBytes = c.doFinal(ccENCBytes); 
    this.plainCardNumber = new String(ccDECBytes); 
    this.last4CreditCard =    plainCardNumber.substring(this.plainCardNumber.length() - 4); 
    } catch (Exception e) { 
    throw new RuntimeException(e); 
    } 
} 

И мой проверочную номер строка: 5123456789. При выполнении этой строки:

byte[] ccDECBytes = c.doFinal(ccENCBytes); 

я получаю следующее excep :

Caused by: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750) 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676) 
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2087) 
    at stbet.model.core.CustomerAccount.decryptCreditCard(CustomerAccount.java:527) 

Что указывает эта ошибка? Любая помощь действительно ценится.

+0

@ArtjomB. Добавлен метод шифрования. –

+0

Ваш код выглядит отлично. Вы уверены, что 'ccNumber' в методе дешифрования является фактическим выходом метода шифрования? –

+0

@ArtjomB. да, выходное значение такое же :( –

ответ

2

Ваш АЛГОРИТМ должен обозначать шифр с заполнением: например: AES/CBC/PKCS5Padding.

И ваше строковое представление закодированного сообщения не может потерять байты. Вы используете кодировку defualt для строки, поэтому, скорее всего, UTF-8 не подходит. Вам нужно отображать байт в байты, например: «ISO-8859-1»

возвращает новую строку (Base64.encodeBase64 (encCCNumber), «ISO-8859-1»);

или просто Base64.encodeBase64String должен выполнять эту работу;

+0

уже определен: ALGORITHM = "AES/ECB/PKCS5Padding "; –

+0

преобразование String/bytes должно сохранять «байты». См. Полный ответ. – Zielu

+0

Я тоже попробовал ваше решение. но все же ошибка такая же. –

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