ELLO!我正在使用聊天应用程序,通过AES / CBC / PKCS5填充加密它的数据。它通过客户端将加密的消息发送到服务器,然后发送回来并解密。不幸的是,每当我解密消息时,我都会得到如下错误:javax.crypto.IllegalBlockSizeException:当使用填充密码解密时,输入长度必须是16的倍数。加密是基于这个程序:(http://www.scottjjohnson.com/blog/AesWithCbcExample.java)完全正常工作,我看不出我的代码和那个代码之间的区别,除了我必须从字符串转换为字节数组。这是我的代码:
客户端(加密):
String message = textField.getText();
// generate a key
KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128); // To use 256 bit keys, you need the "unlimited strength" encryption policy files from Sun.
byte[] key = keygen.generateKey().getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
// build the initialization vector. This example is all zeros, but it
// could be any value or generated using a random number generator.
byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
IvParameterSpec ivspec = new IvParameterSpec(iv);
// initialize the cipher for encrypt mode
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);
// encrypt the message
byte[] encrypted = cipher.doFinal(message.getBytes());
System.out.println("Ciphertext: " + encrypted + "\n");
System.out.println(encrypted);
out.println(encrypted);
textField.setText("");
服务器端:
String input = in.readLine();
writer.println("MESSAGE " + input);
客户(解密):
//DECRYPTION
System.out.println(line);
line = line.substring(8);
System.out.println(line);
// generate a key
KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128); // To use 256 bit keys, you need the "unlimited strength" encryption policy files from Sun.
byte[] key = keygen.generateKey().getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
// build the initialization vector. This example is all zeros, but it
// could be any value or generated using a random number generator.
byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
IvParameterSpec ivspec = new IvParameterSpec(iv);
// reinitialize the cipher for decryption
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec);
// decrypt the message
byte[] decrypted = cipher.doFinal(line.getBytes());
System.out.println("Plaintext: " + new String(decrypted) + "\n");
messageArea.append(name + ": " + decrypted + "\n");
messageArea.setCaretPosition(messageArea.getDocument().getLength());
答案 0 :(得分:4)
您的问题与加密无关。您无法在客户端和服务器之间正确传输数据。
我很确定out.println(encrypted)
不你想做什么,虽然我不完全清楚,因为我不知道out
的类型。您也不应该在解密代码中调用line.getBytes()
。
您应该将密文转换为非有损字符串形式,例如十六进制或base64。所以,试试:
out.println(DatatypeConverter.printHexBinary(encrypted));
和
byte[] decrypted = cipher.doFinal(DatatypeConverter.parseHexBinary(line));