AES对称加密算法及实现
Posted 熊孩子码农之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AES对称加密算法及实现相关的知识,希望对你有一定的参考价值。
一、背景
项目开发中尽管有https协议做安全协议,但是有时候还是会选择自己再将数据手动加密解密一遍。面对这种情况,我们怎么做呢。
① 选择一种加密算法。
② 实现前端与后端的对称加解密。
今天在这里跟大家分享一种实现方案:使用AES对称加密实现前后端数据加解密。前端代码使用JS编写。后端代码使用java编写。一起来看看吧
https://github.com/shen8332402/publicResource/tree/master/AES_JAVA_JS
三、java实现
1.背景与环境
使用AES加密不需要额外的jar包,使用jdk自带的jar就可以。
2.加密算法代码如下
public static String encrypt(String data, String key, String iv) throws Exception {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"
int blockSize = cipher.getBlockSize();
byte[] dataBytes = data.getBytes("utf-8");
int plaintextLength = dataBytes.length;
if (plaintextLength % blockSize != 0) {
plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
}
byte[] plaintext = new byte[plaintextLength];
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(plaintext);
return new Base64().encodeToString(encrypted);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
3.解密算法实现如下
public static String desEncrypt(String data, String key, String iv) throws Exception {
try {
byte[] encrypted1 = new Base64().decode(data);
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original,"utf-8");
return originalString;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
4.参数中的key和iv是什么
key:大家称其为密钥。可以随意定义。
例:public static String KEY = "1234123412ABCDEF";
iv:大家称其为偏移量。也可以随意定义。
例:public static String IV = "ABCDEF1234123412";
四、js实现
1.背景
引入js库文件,引入实现加密算法的页面就可以啦。
2.JS文件头(引入库文件,一些公共属性定义)
import CryptoJS from 'crypto-js';
const key = CryptoJS.enc.Latin1.parse('1234123412ABCDEF');
const iv = CryptoJS.enc.Latin1.parse('ABCDEF1234123412');
const mode = CryptoJS.mode.CBC;
const padding = CryptoJS.pad.ZeroPadding;
3.加密算法如下
function encryptData(data){
//加密
let encrypted = CryptoJS.AES.encrypt(
data,
key,
{
iv: iv, mode: mode, padding: padding
});
return encrypted;
}
4.解密算法如下:
function decryptData(data){
//解密
let decrypted = CryptoJS.AES.decrypt(data, key, { iv: iv, padding: padding });
return decrypted;
}
五:总结
需要注意的点:
1.注意JS中key与vi的定义,一定要按我写的来。
2.注意java中的“AES/CBC/NoPadding”的定义与js中
const mode = CryptoJS.mode.CBC;
const padding = CryptoJS.pad.ZeroPadding;
这两行的定义。
以上两个问题涉及到了AES加密的几种实现方法。简单说一下就是AES加密在java与js中分别有几种不同的实现方式。如果选择的实现方式不同加密解密结果是不同的,所以需要选择它们的公共实现方式。而我在这里提供的实现方法就是取其交集,然后就可以实现前后端加解密。具体我在这里就不陈述了,有兴趣的朋友可以自行去学习一下。
互联网时代,这样的加解密肯定会用到的,怎么样,关注,关注,兄弟关注赶紧关注我吧。
彩蛋彩蛋:昨天,RNG获得了MSI世界冠军,UZI祝贺你,你是我的英雄。
以上是关于AES对称加密算法及实现的主要内容,如果未能解决你的问题,请参考以下文章