使用密码

时间:2017-03-14 05:58:49

标签: java encryption

我正在使用this code

当主要方法中的所有代码都在一个try catch中但是当它分成另一个类并且通过Security对象调用decrypt时,它似乎工作。

我猜一个班级没有得到正确的初始化。

错误:

  

¬U±‡Qœò|À'Zâ\\ SEPERATION \\ javax.crypto.IllegalBlockSizeException:   使用填充密码解密时,输入长度必须是8的倍数   在com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:934)at   com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845)at at   com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)at at   javax.crypto.Cipher.doFinal(Cipher.java:2165)at   Security.decrypt(Security.java:62)at   EncryptAndDecrypt.main(EncryptAndDecrypt.java:15)null

1 个答案:

答案 0 :(得分:1)

这可能是编码/解码过程的问题。您将DES加密的密文存储到String个对象中,而不是首先将cipher.doFinal()的原始字节输出编码为强大的编码方案,如Base64或十六进制。 DES加密将导致每个字节包含介于0x000xFF 0 - 255 )之间的值,但您将此输出存储到String(实际上没有指定字符编码;它可能是US-ASCIIUTF-8或类似的,但这取决于平台,可以由Charset.defaultCharset()确定。将未编码的字节存储到String中的问题是在Unicode,ASCII等中,并非0x00 - 0xFF中的每个值都保证是有效字符。它可以是控制序列,未定义等。

出于这个原因,首先用十六进制或Base64编码密文,然后将其存储为字符串。解密时,反转编码(即解码),然后执行解密。