2013-03-15 6 views
-5

Следующий код основан на криптографии. Внутри моего конструктора, я инициализирую это:Расшифровка IllegalBlockSizeException

try{ 
     //To generate the secret key 
     KeyGenerator keyGen = KeyGenerator.getInstance("DES"); 
     sKey = keyGen.generateKey(); 
     //Initialize the cipher instance to use DES algorithm, ECB mode, 
     //and PKCS#5 padding scheme. 
     cipherObj = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
    } 
    catch(NoSuchAlgorithmException nsae){nsae.printStackTrace(); 

    } 
    catch(NoSuchPaddingException nspe){nspe.printStackTrace();} 

У меня есть этот код под кнопкой называется шифровать и его на самом деле работает

try{ 
    //Initialize the cipher with secret key to encrypt the data. 
    cipherObj.init(Cipher.ENCRYPT_MODE, sKey); 
    //Read the data into byte array 
    byte[] textToEncrypt = txtTobeEncrypted.getText().getBytes(); 
    //To encrypt the data 
    byte[] encryptedData = cipherObj.doFinal(textToEncrypt); 
    //Display the encrypted data 
    String encryptedText = new String(encryptedData); 
    txtEncryptOutput.setText(encryptedText); 
} 
catch(InvalidKeyException ivkey){ivkey.printStackTrace();} 
catch(BadPaddingException bpe){bpe.printStackTrace();} 
catch(IllegalBlockSizeException ilbs){ilbs.printStackTrace();} 

Но следующий код, который находится под кнопкой Расшифровать не работает

try{ 
    //Initialize the cipher with secret key to encrypt the data. 
    cipherObj.init(Cipher.DECRYPT_MODE, sKey); 
    //Read the data into byte array 
    byte[] textToDecrypt = txtEncryptOutput.getText().getBytes(); 
    //To decrypt the data 
    byte[] plainData = cipherObj.doFinal(textToDecrypt); 
    //Display the encrypted data 
    String thePlainText = new String(plainData); 
    txtDecrypt.setText(thePlainText); 
} 
catch(InvalidKeyException ivkey){ivkey.printStackTrace();} 
catch(BadPaddingException bpe){bpe.printStackTrace();} 
catch(IllegalBlockSizeException ilbs){ilbs.printStackTrace();} 

Исключение подводит выглядит следующим образом:

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 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.DESCipher.engineDoFinal(DESCipher.java:314) 
at javax.crypto.Cipher.doFinal(Cipher.java:2086) 
at cryptography.FileEncryption.cmdDecryptActionPerformed(FileEncryption.java:209) 

Так что, пожалуйста, кто-нибудь может объяснить, почему я получаю это исключение?

+0

Возможно, эта ссылка может вам помочь .. [JCE Encryption - стандартное шифрование данных (DES)] (http://www.mkyong.com/java/jce-encryption-data-encryption-standard-des-tutorial /) – Smit

ответ

0

Вы, вероятно, получить это исключение, так как длина txtEncryptOutput.getText().getBytes() не кратно 8.

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

2

Вы не можете декодировать последовательность случайных байтов до String. Большинство кодировок символов не сопоставляют каждую последовательность байтов или байтов символу; они заменят информацию с помощью & # xFFFD; (символ замены).

Вместо этого преобразуйте шифрованный текст в печатную строку и обратно, используя подходящую кодировку типа Base-64.

+0

См. [Этот ответ] (http://stackoverflow.com/a/6077568/3474) для более подробного объяснения. – erickson

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