Java 中的 AES-256-CBC

mar*_*lby 4 java encryption cryptography aes

我正在尝试编写一个简单的 Java 程序,该程序将使用AES-256-CBC. 有课:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AesCBC {
    private byte[] key;
    private byte[] iv;

    private static final String ALGORITHM="AES";

    public AesCBC(byte[] key, byte[] iv) {
        this.key = key;
        this.iv = iv;
    }

    public byte[] encrypt(byte[] plainText) throws Exception{
        SecretKeySpec secretKey=new SecretKeySpec(key,ALGORITHM);
        IvParameterSpec ivParameterSpec=new IvParameterSpec(iv);
        Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE,secretKey,ivParameterSpec);
        return cipher.doFinal(plainText);
    }

    public byte[] getKey() {
        return key;
    }

    public void setKey(byte[] key) {
        this.key = key;
    }

    public byte[] getIv() {
        return iv;
    }

    public void setIv(byte[] iv) {
        this.iv = iv;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且有可能的用法:

byte[] test="a".getBytes();

byte[] key=DatatypeConverter.parseHexBinary("b38b730d4cc721156e3760d1d58546ce697adc939188e4c6a80f0e24e032b9b7");
byte[] iv=DatatypeConverter.parseHexBinary("064df9633d9f5dd0b5614843f6b4b059");
AesCBC aes=new AesCBC(key,iv);
try{
    String result=DatatypeConverter.printBase64Binary(aes.encrypt(test));
    System.out.println(result);
}catch(Exception e){
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

我的输出是VTUOJJp38Tk+P5ikR4YLfw==,但是当我执行此命令时:

/usr/bin/openssl enc -A -aes-256-cbc -base64 -K "b38b730d4cc721156e3760d1d58546ce697adc939188e4c6a80f0e24e032b9b7" -iv "064df9633d9f5dd0b5614843f6b4b059" <<< "a"
Run Code Online (Sandbox Code Playgroud)

我得到了与 Java 程序不同的东西(Y65q9DFdR3k1XcWhA2AO2Q==)。可悲的是,我不知道为什么结果不一样,因为我使用了相同的密钥和 iv 的相同算法。这是否意味着我的 Java 程序不能正常工作?任何帮助,将不胜感激。

mat*_*att 5

两种方式都可以正常工作,但是您正在加密不同的东西。

here 字符串语法 ( <<<) 向字符串添加换行符。所以Java输出是加密“a”的结果,命令行输出是加密“a\n”的结果(即a后跟换行符的字符)。

从命令行试试这个:

printf "a" | /usr/bin/openssl enc -aes-256-cbc -base64 -K "b38b730d4cc721156e3760d1d58546ce697adc939188e4c6a80f0e24e032b9b7" -iv "064df9633d9f5dd0b5614843f6b4b059"
Run Code Online (Sandbox Code Playgroud)

结果是VTUOJJp38Tk+P5ikR4YLfw==,匹配您的 Java 结果。