解密错误:javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是8的倍数
这里是使用DES进行加密和解密的程序。程序在直接传递加密输出进行解密时工作。但当以字符串形式从用户获取输入进行解密时,它会显示此异常。如何以字节为单位传递密码字符串,使其与解密兼容解密错误: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
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);