大家好,又见面了,我是你们的朋友全栈君。
AES 加密又称对称性加密,在开发中常用于对流数据对加密,尤其是流数据在网络传输过程中,担心被泄露,AES 加密被常用于这块的校验中。下面是 AES 加密的百度百科说明解释:
AES加密标准又称为高级加密标准 Rijndael 加密法,是美国国家标准技术研究所NIST旨在取代 DES 的 21 世纪的加密标准。AES 的基本要求是,采用对称分组密码体制,密钥长度可以为 128、192 或 256 位,分组长度 128 位,算法应易在各种硬件和软件上实现。1998 年 NIST 开始 AES 第一轮分析、测试和征集,共产生了 15 个候选算法。 1999 年 3 月完成了第二轮 AES2 的分析、测试。2000 年 10 月 2 日美国政府正式宣布选中比利时密码学家 Joan Daemen 和 Vincent Rijmen 提出的一种密码算法 Rijndael作为 AES 的加密算法。 AES 加密数据块和密钥长度可以是 128b、192b、256b 中的任意一个。AES 加密有很多轮的重复和变换。大致步骤如下: ①密钥扩展(Key Expansion) ②初始轮(InitialRound) ③重复轮(Rounds),每一重复轮又包括字节间减法运算(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)、轮密钥加法运算(AddRoundKey) 等操作 ④最终轮(Final Round),最终轮没有列混合操作(MixColumns)
public static byte[] decryptData(byte[] data, byte[] key, byte[] iv, String transformation) throws Exception {
if (data == null || data.length == 0
|| key == null || key.length < 16
|| iv == null || iv.length < 16
|| transformation == null || transformation.length() == 0) {
throw (new InvalidParameterException());
}
AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
SecretKeySpec newKey = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance(transformation,"BC");
cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
return cipher.doFinal(data);
}
public static byte[] encryptEncode(byte[] data, byte[] key, byte[] iv, String transformation) throws Exception {
if (data == null || data.length == 0
|| key == null || key.length == 0
|| iv == null || iv.length == 0
|| transformation == null || transformation.length() == 0) {
throw (new InvalidParameterException());
}
AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
SecretKeySpec newKey = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance(transformation,"BC");
cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
return cipher.doFinal(data);
}
byte[] baseData = Base64.encode(cipher.doFinal(data), Base64.DEFAULT)
@Test
public void test(){
byte[] data = {
0x01,0x02,0x03,0x04,0x05};
byte[] mAESKey = {
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
byte[] iv = {
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
String mAESTransformation = "AES/CBC/PKCS7Padding";
try {
byte[] encrypt = EncryptUtil.encryptEncode(data, mAESKey, iv, mAESTransformation);
byte[] decrypt = EncryptUtil.decryptData(encrypt, mAESKey, iv, mAESTransformation);
System.out.println("加密前:"+bytes2HexString(data));
System.out.println("加密后:"+bytes2HexString(encrypt));
System.out.println("解密后:"+bytes2HexString(decrypt));
} catch (Exception e) {
e.printStackTrace();
}
}
public static String bytes2HexString(byte[] bytes) {
String ret = "";
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
加密前:0102030405
加密后:F2C0C2091ABB5CC09FC71E4614E0733B
解密后:0102030405
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/145786.html原文链接:https://javaforall.cn
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有