gpt4 book ai didi

java - 使用填充密码解密时,输入长度必须是 8 的倍数

转载 作者:行者123 更新时间:2023-12-02 10:36:34 27 4
gpt4 key购买 nike

我有一个客户端/服务器应用程序,可以在客户端和服务器端加密或解密消息。但是在解密时,我不断从 StackTrace 收到以下错误

Input length must be multiple of 8 when decrypting with padded cipher

以下是服务器类和客户端类的代码。问题是我尝试使用 ("DES/CBC/PKCS5Padding")("UTF-8") 但仍然无法解决上述问题。任何帮助将不胜感激,谢谢?

public class ServerApp   {

public static byte[] encrypt(String input, Key k) {
try {

Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, k);
byte[] data = input.getBytes();
byte[] result = cipher.doFinal(data);

return result;
} catch (Exception ex) {
return null;
}
}

public static String decrypt(byte[] cipher, Key k) {
try {

Cipher cipher1 = Cipher.getInstance("DES");
cipher1.init(Cipher.DECRYPT_MODE, k);
byte[] original = cipher1.doFinal(cipher);
return new String(original);

} catch (Exception ex) {
return null;
//Logger.getLogger(DES.class.getName()).log(Level.SEVERE, null, ex);
}
}

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

Key key=KeyGen.getSecretKey();
ServerSocket ser = new ServerSocket(3333);
System.out.println("Server Started");
Socket client = ser.accept();
DataInputStream in = new DataInputStream(client.getInputStream());
DataOutputStream out = new DataOutputStream(client.getOutputStream());
Scanner scan = new Scanner(System.in);
// SecretSocket sc = new SecretSocket(client, KeyGen.getSecretKey());
String serMsg, cliMsg, plain;
// OutputStream sout = sc.getOutputStream();
// InputStream sin = sc.getInputStream();
do {
System.out.print("You say: ");
serMsg = scan.nextLine();

// sout.write(serMsg.getBytes());
// System.out.println("cli server "+sin.read());

byte[] ci = encrypt(serMsg, KeyGen.getSecretKey());
System.out.println("encrypt " +ci.toString());
out.writeUTF(ci.toString());
plain = decrypt(ci, KeyGen.getSecretKey() );
System.out.println("decrypt " + plain);
} while (!serMsg.equals("end"));
client.close();
ser.close();
} catch (IOException ex) {
Logger.getLogger(ServerApp.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

public class ClientApp {

public static byte[] encrypt(String input, Key k) {
try {

Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, k);
byte[] data = input.getBytes();
byte[] result = cipher.doFinal(data);

return result;
} catch (Exception ex) {
return null;
}
}

public static String decrypt(byte[] cipher, Key k) {
try {

Cipher cipher1 = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher1.init(Cipher.DECRYPT_MODE, k);
byte[] original = cipher1.doFinal(cipher);
return new String(original);

} catch (Exception ex) {
return null;
//Logger.getLogger(DES.class.getName()).log(Level.SEVERE, null, ex);
}
}

public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
try {
Socket s = new Socket("localhost", 3333);
DataInputStream in = new DataInputStream(s.getInputStream());
DataOutputStream out = new DataOutputStream(s.getOutputStream());
Scanner scan = new Scanner(System.in);
String serMsg, cliMsg, plain;

do {

System.out.println("server server "+in.readUTF());

serMsg = in.readUTF();
System.out.println("enc: " + serMsg);
plain = decrypt(serMsg.getBytes("UTF-8"), KeyGen.getSecretKey());
System.out.println("Server says: " + plain);

} while (!serMsg.equals("end"));
s.close();
} catch (IOException ex) {
Logger.getLogger(ClientApp.class.getName()).log(Level.SEVERE, null, ex);
}
}

最佳答案

        Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, k);
byte[] data = input.getBytes();
byte[] result = cipher.doFinal(data);
  1. 在没有 IV 的情况下使用 DES,您就隐式使用 DES/ECB/PKCS5Padding

  2. 不直接打印字节数组。 Java 将只输出可打印字符。 打印时始终对字节数组进行编码和解码(Hex 或 Base64 是最常见的编码)

这是一个example project

Base64.getEncoder().encodeToString(byteArray) 
  • 我希望您知道 DES 目前被认为是一种弱密码,只能用于向后兼容。
  • 关于java - 使用填充密码解密时,输入长度必须是 8 的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53254779/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com