大家好,欢迎来到IT知识分享网。
AES是一种最常见的对称(加密和解密用相同的密钥)加密算法。crypto模块提供了AES支持,但是需要自己封装好函数,便于使用。
AES加密流程
- 明文:没有经过加密的数据。
- 密钥K:用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。
- AES加密函数:设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。
- 密文C:经加密函数处理后的数据
- AES解密函数:设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。
AES的基本结构
AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完所有组。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节。密钥的长度也支持128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。如下表:
AES-128,也就是密钥的长度为128位,加密轮数为10轮。AES的加密公式为C = E(K,P),在加密函数E中,会执行一个轮函数,并且执行10次这个轮函数,这个轮函数的前9次执行的操作是一样的,只有第10次有所不同。也就是说,一个明文分组会被加密10轮。AES的核心就是实现一轮中的所有操作。
AES的处理单位是字节,128位的输入明文分组P和输入密钥K都被分成16个字节,分别记为P = P0 P1 … P15 和 K = K0 K1 … K15。如,明文分组为P = abcdefghijklmnop,其中的字符a对应P0,p对应P15。
AES程序代码
1、安装模块
npm install crypto-js
2、crypto.js
import CryptoJS from "crypto-js";
const key = CryptoJS.enc.Utf8.parse("1234567890abc765"); //16位
const iv = CryptoJS.enc.Utf8.parse("1234567890000000");
// AES加密
export function Encrypt(word,keyStr,ivStr){
let key = KEY, iv = IV, srcs, encrypted;
if (keyStr) {
key = CryptoJS.enc.Utf8.parse(keyStr);
iv= CryptoJS.enc.Utf8..encrypt(ivStr);
}
srcs= CryptoJS.enc.Utf8.parse(word);
encrypted= CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.EBC,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.base64.stringify(encrypted.ciphertext); //返回base64格式密文
},
// AES解密
export function Decrypt(word,keyStr,ivStr){
let key = KEY, iv = IV, base64, src, decrypt, decryptedStr;
if (keyStr) {
key = CryptoJS.enc.Utf8.parse(keyStr);
iv= CryptoJS.enc.Utf8..encrypt(ivStr);
}
base64 = CryptoJS.enc.Base64.parse(word);
src = CryptoJS.enc.Base64.stringify(base64);
decrypt = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
key 是密钥 ,iv 是密钥偏移量,这个一般是接口返回的,或者前后端协定一致。值得注意的是密钥的长度,由于对称解密使用的算法是 AES-128-CBC算法,数据采用 PKCS#7 填充 , 因此这里的 key 需要为16位。
3、使用
import {
Encrypt } from "crypto";
let newPassword = Encrypt(password);
注意到AES有很多不同的算法,如aes192,aes-128-ecb,aes-256-cbc等,AES除了密钥外还可以指定IV(Initial Vector),不同的系统只要IV不同,用相同的密钥加密相同的数据得到的加密结果也是不同的。
加密结果通常有两种表示方法:hex和base64,这些功能Nodejs全部都支持,但是在应用中要注意,如果加解密双方一方用Nodejs,另一方用Java、PHP等其它语言,需要仔细测试。如果无法正确解密,要确认双方是否遵循同样的AES算法,字符串密钥和IV是否相同,加密后的数据是否统一为hex或base64格式。
参考
AES加密算法的详细介绍与实现
廖雪峰的官方网站
AES加密算法
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/15191.html