解密错误:javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是8的倍数

解密错误:javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是8的倍数,java,encryption,cryptography,byte,des,Java,Encryption,Cryptography,Byte,Des,这里是使用DES进行加密和解密的程序。程序在直接传递加密输出进行解密时工作。但当以字符串形式从用户获取输入进行解密时,它会显示此异常。如何以字节为单位传递密码字符串,使其与解密兼容 import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import javax.crypt

这里是使用DES进行加密和解密的程序。程序在直接传递加密输出进行解密时工作。但当以字符串形式从用户获取输入进行解密时,它会显示此异常。如何以字节为单位传递密码字符串,使其与解密兼容

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKeyFactory;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.DESKeySpec;
import javax.xml.bind.DatatypeConverter;
public class DESEncryptionDecryption {

private static Cipher encryptCipher;
private static Cipher decryptCipher;

public static void main(String[] args) throws InvalidKeySpecException {
try {

String desKey = "0123456789abcdef"; // value from user
byte[] keyBytes = DatatypeConverter.parseHexBinary(desKey);
System.out.println(keyBytes);

SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
SecretKey key = factory.generateSecret(new DESKeySpec(keyBytes));

encryptCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedData = encryptData("Confidential data"); //String from user

String s=encryptedData.toString();//String input to decrypt From user
byte[] bb=s.getBytes();

decryptCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
decryptCipher.init(Cipher.DECRYPT_MODE, key);
decryptData(bb); //Exception

}catch (NoSuchAlgorithmException e) {
       e.printStackTrace();
      } catch (NoSuchPaddingException e) {
       e.printStackTrace();
      } catch (InvalidKeyException e) {
       e.printStackTrace();
      } catch (IllegalBlockSizeException e) {
       e.printStackTrace();
      } catch (BadPaddingException e) {
       e.printStackTrace();
      }}
//method for encryption
private static byte[] encryptData(String data)
       throws IllegalBlockSizeException, BadPaddingException {
      System.out.println("Data Before Encryption :" + data);
      byte[] dataToEncrypt = data.getBytes();
      byte[] encryptedData = encryptCipher.doFinal(dataToEncrypt);
      System.out.println("Encryted Data: " + encryptedData);

      return encryptedData;
     }

//method for decryption

private static void decryptData(byte[] data)
throws IllegalBlockSizeException, BadPaddingException {
byte[] textDecrypted = decryptCipher.doFinal(data); //Exception trigered here
System.out.println("Decryted Data: " + new String(textDecrypted));
}}

我很难判断这是否都是错的,但这绝对是错的:

byte[] encryptedData = encryptData("Confidential data"); //String from user
String s=encryptedData.toString();//String input to decrypt From user
byte[] bb=s.getBytes();
只需解密
encryptedData
而不是
bb
。您的
s
值基本上是无用的,因为您在
字节[]
上调用了
toString()
,这不会给您带来明显的期望。
s
的值类似于
”[B@15db9742“
因为数组在Java中不重写
toString()

如果确实要将任意二进制数据(如加密结果)转换为文本,请改用。使用base64对加密结果进行编码以获取字符串,然后base64将其从字符串解码为字节数组,然后解密该字节数组


哦,我强烈建议不要使用
String(byte[])
String.getBytes()
太多-始终使用采用字符编码的重载。

不要调用
toString()
在一个字节数组上。这和你想象的不一样。考虑到你已经有了字节,你甚至不清楚为什么要使用
s
。你能把导入文件和所有需要的东西放进去吗?这样我们就可以复制粘贴代码,编译并运行它了吗?@jon假设s是用户输入的字符串。用户can只在字符串中输入它。好的,我给代码进行编译。然后他们应该使用base64,你应该解码base64以获得加密的二进制数据。加密的数据不是文本,不应该被视为文本。如何使用base64?我基本上需要以文本格式向远程用户发送加密的数据。远程用户必须解密数据密码。他将以字符串格式输入。所以程序需要转换成兼容的格式来解密。@nitinkt:好的,您是按照链接进行的,还是进行了web搜索?堆栈溢出非常有助于帮助人们,但您确实需要自己付出一点努力。是的,我已经为此搜索了3个多小时。在堆栈溢出和谷歌中。但是我无法理解。@nitinkt:我在32分钟前才发布了我的答案,所以除非你已经知道你应该使用base64,并且懒得提及它,否则我很怀疑你已经搜索了3个小时如何使用base64。再说一次,你有没有关注我的链接?(这是一个带有库的页面,非常容易使用。调用
Base64.encodeBytes(String)
Base64.decode(byte[])
…您的Base64链接工作正常。我将这些行编辑为,
String s=Base64.encode(encryptedData);byte[]bb=Base64.decode(s);