1.php5.* 和php7.* 的 aes-128-cbc实现都是不一样的。
2.php7.* 代码
openssl_encrypt($str, 'aes-128-cbc', $secrete_key,OPENSSL_NO_PADDING, $iv);
对应实现模式:AES/CBC/NOPADDING
3.使用Java实现

 private static String encrypt(String data, String key) {
        String ivStr="";
        for (int i = 0; i < 16; i++) {
            ivStr+="\0";
//        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        String secretKey = new String(Base64.decode(key)).trim();
        //把data字节补全为16位
        data = addPKCS7Padding(data);
        //使用128长度,utf-8是8位字节
        byte[] sub = ArrayUtil.sub(secretKey.getBytes(), 0, 16);
        try {
            SecretKeySpec desKeySpec = new SecretKeySpec(sub,"AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/noPadding");
            IvParameterSpec  iv = new IvParameterSpec(ivStr.getBytes("utf-8"));
            cipher.init(Cipher.ENCRYPT_MODE, desKeySpec, iv);
            //一定要加编码,不然可能会以别的编码获取字节,导致位数不对
            byte[] bytes = cipher.doFinal(data.getBytes("utf-8"));
            return new String(Base64.encode(bytes));
        } catch (Exception e) {
            e.printStackTrace();
            log.error("error", e);
        return null;

4.aes其他填充 若使用AES/CBC/PKCS7Padding,可在jdk8直接运行,但是输出结果不一致,需使用其他provider

        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

5.此provider pom

        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk16</artifactId>
            <version>1.46</version>
        </dependency>

6.代码如下

    private static String encrypt(String data, String key) {
        String ivStr="";
        for (int i = 0; i < 16; i++) {
            ivStr+="0";
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        String secretKey = new String(Base64.decode(key)).trim();
        data = addPKCS7Padding(data);
        //使用128长度,utf-8是8位字节
        byte[] sub = ArrayUtil.sub(secretKey.getBytes(), 0, 16);
        try {
            SecretKeySpec desKeySpec = new SecretKeySpec(sub,"AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
            IvParameterSpec  iv = new IvParameterSpec(ivStr.getBytes("utf-8"));
            cipher.init(Cipher.ENCRYPT_MODE, desKeySpec, iv);
            byte[] bytes = cipher.doFinal(data.getBytes());
            return new String(Base64.encode(bytes));
        } catch (Exception e) {
            e.printStackTrace();
            log.error("error", e);
        return null;
  1. note
    ivstr为偏移向量,请自己实现,
    addPKCS7Padding方法为padding字符串方法,请自行实现,
    key为密钥,我使用的是base64字符串
1.php5.* 和php7.* 的 aes-128-cbc实现都是不一样的。2.php7.* 代码openssl_encrypt($str, 'aes-128-cbc', $secrete_key,OPENSSL_NO_PADDING, $iv);对应实现模式:AES/CBC/PKCS7Padding、AES/CBC/PKCS5Padding若使用AES/CBC/PKCS5Padding,可在jdk8直接运行,但是输出结果不一致,需使用其他provider Security.add openssl enc -e -aes-128-cbc -in input.bin -out encrypt.bin -K 2855BF35EC712314546DC253EBD204435 -iv 24561617F6E0C1054D3907BF92B09335 -p 如果是AES-256时,将指令的128改成256即可 openssl aes-128-cbc -d -in encrypt.bin -out decode.bin -K 2855BF35EC712314546DC253EBD2
记录下最近学到的加密方式。废话少说,直接上菜。 首先,AES是对称性加密,加密解密使用的密钥是一样的。其次,AES-128-CBC模式加密,要求密钥key和偏移量IV的长度要一致,且长度都是16才可以加密。 中间进行加密。 最后,为了提高安全性,可以再进行一次base64编码。 package utils; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.
(一)KeyGenerator Java提供了一个名称为KeyGenerator的类,该类用于生成密钥,此类的对象是可重用的。 要使用KeyGenerator类生成密钥,请按照以下步骤操作 第1步:创建KeyGenerator对象 KeyGenerator类提供getInstance()方法,该方法接受表示所需密钥生成算法的String变量,并返回生成密钥的KeyGenerator对象。 第2步:创建SecureRandom对象java.Security包的SecureRand
关于openssl的使用,在网上的例子都比较简单,有一些很难理解,由于我做的项目中有使用,所以将一些心得展开给大家。 在进行文件加密时,如果没有特别的要求,推荐使用对称加密方法(aes-128-cbc),详细使用如下: 1. 首先我们需要准备被加密的文件和数据。 echo "AABBCCDDEEFFGGHHMMNNOOPPQQ" > input.bin 2. 因为我们要使用aes...
写个这个问题呢,是自己项目中遇到了!最后java 的伙伴陪同我一起解决了,所以就记录下啦!不做页面优化了! java使用aes-128 加密与php 使用aes-128加密是不一样的,首先,java加密,不要做填充,PHP 加密是没有做填充的! 以下是PHP 7以上的加密 $key = '1234567890123456'; //16字节 $iv = '1234567890123456'...
AES-128-CBC是一种对称密钥加密算法,其中AES代表高级加密标准(Advanced Encryption Standard),128表示使用128位的密钥长度,CBC表示密码分组链接模式(Cipher Block Chaining)。 在AES-128-CBC中,数据被分为固定长度的块,并使用128位的密钥进行加密和解密。加密时,每个数据块会与前一个加密的数据块进行异或操作,以增加安全性。初始块由初始化向量(IV)指定,IV必须是随机且不可预测的。 AES-128-CBC具有以下特点: 1. 强大的安全性:采用128位的密钥长度和CBC模式,可提供较高的安全性,抵御当前常用的攻击手段。 2. 快速的加解密速度:AES算法基于矩阵运算,可以通过硬件优化和并行计算进行加速,实现快速的加解密操作。 3. 可逆性:加密和解密操作使用相同的密钥,可以实现数据的可逆转换,保证数据的完整性和可读性。 4. 简单易用:Java提供了内置的加密库,使得在Java中使用AES-128-CBC算法变得简单方便。 然而,AES-128-CBC也存在一些不足之处: 1. 密钥管理:由于使用对称密钥,需要使用者妥善管理密钥的生成、传输和保存,以保证密钥的安全性。 2. 块长度有限:AES-128-CBC只能处理固定长度的数据块,如果数据长度不是块长度的整数倍,需要进行填充或截断操作。 3. CBC模式下的性能损耗:由于每个数据块都需要依赖前一个数据块的加密结果,导致加解密操作无法并行处理,可能造成一定的性能损耗。 总的来说,AES-128-CBC是一种安全性较高、速度较快的对称密钥加密算法,适用于Java环境下的数据加密和解密需求。使用时需要注意密钥管理和数据块长度限制等问题。
public static String ImageToBase64(byte[] imgByte) { BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(imgByte);// 返回Base64编码过的字节数组字符串