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";
String secretKey = new String(Base64.decode(key)).trim();
data = addPKCS7Padding(data);
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);
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;
- 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编码过的字节数组字符串