Java 8 - Base64编码生成" =="无法解码

时间:2015-03-19 13:50:49

标签: java encoding base64 decoding

我目前正致力于服务器/客户端系统:

  • 将用户名和密码发送到服务器
  • 将未定义的大文件发送到客户端

我想用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)

我正在使用日蚀 如果我只使用类似消息"访问被拒绝"也没有问题。

1 个答案:

答案 0 :(得分:4)

请参阅Encoder

Base64.Encoder myencoder = Base64.getEncoder().withoutPadding();

使用withoutPadding会产生一个新的编码器,而不是在文件末尾写=个填充字符。