簡體   English   中英

Java 8 - Base64 編碼生成無法解碼的“==”

[英]Java 8 - Base64 encoding generates “==” which can not be decoded

我目前正在開發一個服務器/客戶端系統,它應該:

  • 將用戶名和密碼發送到服務器
  • 向客戶端發送一個未定義的大文件

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

我在兩者之間使用日食。
如果我只使用“拒絕訪問”之類的消息,也沒有問題。

請參閱編碼器

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

使用 withoutPadding 會產生一個新的編碼器,不會在文件末尾寫入= pad 字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM