2013-08-09 3 views
0

Я пытаюсь зашифровать класс Cipher некоторое время, и у меня все еще возникают проблемы. У меня проблемы с заполнением и размером массива байтов. Я получаю это исключение «Длина входной должна быть кратна 8 при расшифровке с мягким шифром» Это код, который я написал:Исключение при дешифровании строки

public CipherClass() { 
    try { 
     cipher = Cipher.getInstance(CIPHER_ALGO); 
     secKey = SecretKeyFactory.getInstance(CIPHER_ALGO).generateSecret(new DESedeKeySpec(new BigInteger(KEY, 16).toByteArray())); 
    } 
    catch(GeneralSecurityException e){ 
     e.printStackTrace(); 
    } 
} 

private String encrypt(String text){ 
    try { 
     cipher.init(Cipher.ENCRYPT_MODE, secKey); 
     Base64 encoder = new Base64(); 
     return new String(encoder.encode(cipher.doFinal(text.getBytes()))); 
    } 
    catch(GeneralSecurityException e) { 
     e.printStackTrace(); 
    } 
    return ""; 
} 

private String decrypt(String text) { 
    try { 
     cipher.init(Cipher.DECRYPT_MODE, secKey); 
     Base64 decoder = new Base64(); 
     return new String(decoder.decode(cipher.doFinal(text.getBytes()))); 
    } 

    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return ""; 
} 

Я также попытался с помощью Hex вместо Base64 и я получаю это исключение: «Учитывая, что окончательный блок неправильно вставлен»

, пожалуйста, помогите мне, чтобы найти ошибку. благодарит заранее.

+0

ли вы посмотрите на это: http://stackoverflow.com/questions/8049872/given-final-block-not-properly-padded – Kon

+0

я класс для шифрования/дешифрования строк в прошлом году так же, как вам сделал. По причинам, которые я не помню, мне приходилось получать текстовые байты в формате UTF-8. Попробуйте изменить свою последнюю строку, например 'return new String (encoder.encode (cipher.doFinal (text.getBytes (Charset.forName (« UTF-8 »))));' – dic19

+2

Вам нужно запустить декодер base64, прежде чем расшифровать , Операции должны отражать друг друга: 'encrypted = encrypt (plaintext)', 'encodedAndEncrypted = encode (encrypted)'; 'encrypted = decode (encodedAndEncrypted)', 'plaintext = decrypt (encrypted)' –

ответ

0

Перед расшифровкой необходимо запустить декодер base64. Операции должны отражать друг друга: encrypted = encrypt(plaintext), encoded = encode(encrypted); encrypted = decode(encoded), plaintext = decrypt(encrypted)

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