我正在使用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
答案 0 :(得分:1)
这可能是编码/解码过程的问题。您将DES加密的密文存储到String
个对象中,而不是首先将cipher.doFinal()
的原始字节输出编码为强大的编码方案,如Base64或十六进制。 DES加密将导致每个字节包含介于0x00
和0xFF
( 0 - 255 )之间的值,但您将此输出存储到String
(实际上没有指定字符编码;它可能是US-ASCII
,UTF-8
或类似的,但这取决于平台,可以由Charset.defaultCharset()
确定。将未编码的字节存储到String
中的问题是在Unicode,ASCII等中,并非0x00
- 0xFF
中的每个值都保证是有效字符。它可以是控制序列,未定义等。
出于这个原因,首先用十六进制或Base64编码密文,然后将其存储为字符串。解密时,反转编码(即解码),然后执行解密。