java - 如何修复我遇到的 Base64 错误?

标签 java base64

在阅读了大量有关 AES、JCE 及其 256 位 key 的无限强度策略文件之后,以及此 Oracle/Sun guide我已经实现了这个。

更新

我结合了sun提供的代码,做了一个java类 AESencrp.java

/**
 *
 * @author MUDASSIR
 */

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.*;

public class AESencrp {

     private static final String ALGO = "AES";
//    private static final byte[] keyValue = 
//        new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't',
//'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };

public static String encrypt(String Data, byte[] keyValue) throws Exception {
        Key key = generateKey(keyValue);
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = c.doFinal(Data.getBytes());
        String encryptedValue = new BASE64Encoder().encode(encVal);
        return encryptedValue;
    }

    public static String decrypt(String encryptedData, byte[] keyValue) throws Exception {
        Key key = generateKey(keyValue);
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.DECRYPT_MODE, key);
        byte[] decodedValue = new BASE64Decoder().decodeBuffer(encryptedData);
        byte[] decValue = c.doFinal(decodedValue);
        String decryptedValue = new String(decValue);
        return decryptedValue;
    }
    private static Key generateKey(byte[] keyValue) throws Exception {
        Key key = new SecretKeySpec(keyValue, ALGO);
        return key;
}

}

这工作得很好,但每当我构建项目时,它都会发出警告:
“Base64encoder 是专有软件,必须在未来版本中删除”。

当我删除base64编码器并使用asHex方法代替(由sun指南here提供)时,它给了我一个BadPadding异常。
线程“main”中的异常 javax.crypto.BadPaddingException:给定的最终 block 未正确填充

这是我的代码,没有base64编码器

/**
 *
 * @author MUDASSIR
 */

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.*;

public class AESencrp2 {

     private static final String ALGO = "AES";
//    private static final byte[] keyValue = 
//        new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't',
//'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };

     public static String asHex(byte buf[]) {
        StringBuilder strbuf = new StringBuilder(buf.length * 2);
        int i;

        for (i = 0; i < buf.length; i++) {
            if (((int) buf[i] & 0xff) < 0x10) {
                strbuf.append("0");
            }

            strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
        }

        return strbuf.toString();
    }

public static String encrypt(String Data, byte[] keyValue) throws Exception {
        Key key = generateKey(keyValue);
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedValue = c.doFinal(Data.getBytes());
        return asHex(encryptedValue);
    }

    public static String decrypt(String encryptedData, byte[] keyValue) throws Exception {
        Key key = generateKey(keyValue);
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.DECRYPT_MODE, key);
        byte[] decValue = c.doFinal(encryptedData.getBytes());
        String decryptedValue = new String(decValue);
        return decryptedValue;
    }
    private static Key generateKey(byte[] keyValue) throws Exception {
        Key key = new SecretKeySpec(keyValue, ALGO);
        return key;
}

}

这是主要部分,我在其中尝试代码

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

        byte[] keyValue = new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't',
'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };

        String password = "This is the data that is going to be encrypted";

        String passwordEnc = AESencrp.encrypt(password, keyValue);
        //String passwordEnc = AESencrp2.encrypt(password, keyValue);

        String passwordDec = AESencrp.decrypt(passwordEnc, keyValue);
        //String passwordDec = AESencrp.decrypt(passwordEnc, keyValue);

        System.out.println("Plain Text : " + password);
        System.out.println("Encrypted Text : " + passwordEnc);
        System.out.println("Decrypted Text : " + passwordDec);
} 

问题

  1. 1 - 如果我使用 base64 编码器,它是专有的。
  2. 2 - 如果使用sun提供的asHex方法,我会得到错误的填充异常。

请帮忙。

最佳答案

您可以使用自己的 Base64 编码/解码例程来解决该问题。

关于java - 如何修复我遇到的 Base64 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11326716/

相关文章:

java - 映射集合元素并保留对源集合的引用

java - 无法将 Base64 字符串解码为位图

android - 使用 loadDataWithBaseURL 以 base64 编码加载数据

haskell - 将 base64-bytestring 与惰性 ByteString 结合使用

java - java.util.Base64.getMimeDecoder() 接受长度超过 76 个字符的 String 是否正常?

android - 无需压缩即可将位图编码和解码为字节数组

java - 根据照片属性按字母顺序对照片 ArrayList 进行排序

java - 如何对基于 KinesisRecord 的 DoFn 进行单元测试?

java - 什么是NullPointerException,我该如何解决?

java - 删除生成 PDF 时 @page CSS 选择器的不一致 Flyingsaucer 默认填充