【发布时间】:2015-03-19 13:50:48
【问题描述】:
我目前正在开发一个服务器/客户端系统,它应该:
- 将用户名和密码发送到服务器
- 向客户端发送未定义的大文件
我想使用 AES 对这两个步骤进行编码,然后使用 Base64 编码。第一步已经可以了,但是如果我想发送文件,Base64 编码会生成一个“==”,导致解码器认为这是文件的结尾。
用于我的编码的类
package tools;
import java.security.MessageDigest;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class AES {
public static String cryptString(String toCrypt) {
String ret = "";
try {
String keyStr = "key";
byte[] key = keyStr.getBytes("ASCII");
MessageDigest sha = MessageDigest.getInstance("MD5");
key = sha.digest(key);
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] crypt = cipher.doFinal(toCrypt.getBytes("ASCII"));
Base64.Encoder myencoder = Base64.getEncoder();
String crypted = myencoder.encodeToString(crypt);
ret = new String(crypted).trim();
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
public static String decryptString(String crypted) {
String ret = "";
try {
String keyStr = "key";
byte[] key = keyStr.getBytes("ASCII");
MessageDigest sha = MessageDigest.getInstance("MD5");
key = sha.digest(key);
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
Base64.Decoder myDecoder = Base64.getDecoder();
byte[] encrypt = myDecoder.decode(crypted.trim().getBytes("ASCII"));
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
ret = new String(cipher.doFinal(encrypt)).trim();
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
}
如果我尝试在客户端解码字符串时抛出的错误
java.lang.IllegalArgumentException: Input byte array has incorrect ending byte at 856
at java.util.Base64$Decoder.decode0(Unknown Source)
at java.util.Base64$Decoder.decode(Unknown Source)
at tools.AES.decryptString(AES.java:39)
我正在使用eclipse之间。
如果我只使用“拒绝访问”之类的消息,也没有问题。
【问题讨论】:
-
您的代码在 Java 8 上运行没有问题。
-
是的。但是,如果我发送更大的文件/消息,则会发生此错误。此时此刻,我遇到了与 AES 加密类似的问题。对于小的消息它可以工作,但对于较大的消息它会抛出一个 BadPaddingException,我不知道如何修复。
标签: java encoding base64 decoding