当前位置: 首页 > 面试题库 >

Java中的AES-256-CBC

章高朗
2023-03-14
问题内容

我正在尝试编写一个简单的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;
    }
}

有可能的用法:

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();
}

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

/usr/bin/openssl enc -A -aes-256-cbc -base64 -K "b38b730d4cc721156e3760d1d58546ce697adc939188e4c6a80f0e24e032b9b7" -iv "064df9633d9f5dd0b5614843f6b4b059" <<< "a"

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


问题答案:

两种方法都可以正常工作,但是您正在加密不同的事物。

此处的字符串语法(<<<)在字符串中添加了换行符。因此,Java输出是加密“ a”的结果,而命令行输出是加密“ a \
n”(即,字符a后跟换行符)的结果。

从命令行尝试:

printf "a" | /usr/bin/openssl enc -aes-256-cbc -base64 -K "b38b730d4cc721156e3760d1d58546ce697adc939188e4c6a80f0e24e032b9b7" -iv "064df9633d9f5dd0b5614843f6b4b059"

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



 类似资料:
  • 问题内容: 我有下面的Java代码来加密使用64个字符的密钥的字符串。我的问题是这将是AES-256加密吗? 以下是结合了divanov和laz建议的代码。 问题答案: 是的,它将是64个字符,即32个字节和256位,并且256位的任何序列都可以用作AES-256密钥。 我建议您使用DatatypeConverter.parseHexBinary(或您选择的库中的类似实用程序)将十六进制字符串转换

  • tag到底是什么意思?我们为什么需要它?

  • 我在Erlang中加密AES 256位CBC然后用c代码解密它时遇到了一个问题。而加密/解密在Erlang和C中有效,但不能从一个到另一个。 和 c 代码 我得到的错误是 当我在Erlang中解密时,它可以正常工作,当我在C中加密时,它也可以使用相同的Key和IV。它是否是密码模式不匹配。虽然在我看来是正确的。任何指针都会非常有用。谢谢。 我算出,同样的数据我用C加密和解密,然后进行十六进制转储。

  • 问题内容: 我有几个库,C#,PHP和Android,它们都以相同的方式加密/解密字符串,因此它们彼此兼容,即C#将数据写入和加密到数据库中,PHP可以成功解密并返回原始字符串。 现在,我需要对标准Java应用程序执行相同的操作,因此我已经从Android库中获取了代码,并且需要库,但是却遇到了异常。据我所知,代码不是特定于Android的,因此应该不是问题。 下面是我的加密功能 当我打电话时,出

  • 这是一个错误: 1.JS

  • 我正在加密我的Android应用程序中的一些数据,然后这些数据被发送到一个PHP页面进行解密和处理。 这有帮助吗?