网站首页 > 技术文章 正文
在软件开发过程,为保证数据传输和存储安全,加密是一种重要的技术手段。其中,AES(Advanced Encryption Standard)是一种常用的对称加密算法,它可以通过不同的模式和填充方式来满足不同的加密需求。
在本文中,我们将重点介绍 AES 加密算法的 ECB 模式和 PKCS5Padding 填充方式,以及如何在 Js、Java 、Python、Node.js等几种常用编程语言中实现加密和解密的过程。
- ECB 模式:ECB(Electronic Codebook)模式是最简单的 AES 加密模式之一。它将明文分割成固定大小的数据块,并对每个数据块分别进行加密。每个数据块之间是独立的,因此,相同的明文块将始终生成相同的密文块。
- PKCS5Padding 填充方式:一种常用的填充方式,用于将数据块调整为固定长度的倍数。在 AES 加密中,数据块长度通常为 128 位(16 字节),如果明文长度不是块长度的整数倍,就需要使用填充方式进行补位。例如,如果需要补位 5 个字节,就会使用值为 0x05 的字节进行填充。
JS版本
在 JavaScript 中使用 CryptoJS 库进行 AES/ECB/PKCS5Padding 加密时,你可以按照以下方式进行操作:
通过 npm 安装 crypto-js:
npm install crypto-js
示例代码:
import CryptoJS from 'crypto-js';
// 明文
const plaintext ='{"objectName":"test","pageNo":0,"pageSize":10}'
// 密钥,用户自定义
const key = '1234567890123456';
function encrypt(data, key) {
const sKey = CryptoJS.enc.Utf8.parse(key);
const sContent = CryptoJS.enc.Utf8.parse(data);
const encrypted = CryptoJS.AES.encrypt(sContent, sKey, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
return encrypted.toString();
}
function decrypt(data, key) {
const sKey = CryptoJS.enc.Utf8.parse(key);
const decrypt = CryptoJS.AES.decrypt(data, sKey, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
const encrypted = encrypt(plaintext, key)
console.log('加密:', encrypted);
const decrypted = decrypt(encrypted, key)
console.log('解密:', decrypted);
上述示例代码输出结果:
加密: Qo3E1B8ZR6Mry99RJm+h41hl/AFpFd6eczi//vidPdleezANZ+3T3DJsqEx3HhRu
解密: {"objectName":"test","pageNo":0,"pageSize":10}
Java版本
在 Java 中,可以使用 javax.crypto 包中的 Cipher 类来实现 AES 加密和解密。
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AESUtil {
private static final String AES_ALGORITHM = "AES";
private static final String AES_TRANSFORMATION = "AES/ECB/PKCS5Padding";
// 密钥,用户自定义
private static final String AES_KEY = "1234567890123456";
public static String encrypt(String plaintext) {
try {
SecretKeySpec secretKey = new SecretKeySpec(AES_KEY.getBytes(StandardCharsets.UTF_8), AES_ALGORITHM);
Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedBytes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String decrypt(String encryptedText) {
try {
SecretKeySpec secretKey = new SecretKeySpec(AES_KEY.getBytes(StandardCharsets.UTF_8), AES_ALGORITHM);
Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes, StandardCharsets.UTF_8);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws Exception {
// 明文
String plaintext = "{\"objectName\":\"test\",\"pageNo\":0,\"pageSize\":10}";
// AES 加密
String encryptedText = encrypt(plaintext);
System.out.println("加密: " + encryptedText);
// AES 解密
String decryptedText = decrypt(encryptedText);
System.out.println("解密: " + decryptedText);
// 解密前端密文,上述js版本AES加密生成
String decryptedText2 = "Qo3E1B8ZR6Mry99RJm+h41hl/AFpFd6eczi//vidPdleezANZ+3T3DJsqEx3HhRu";
System.out.println("解密前端密文: " + decryptedText2);
}
}
上述示例代码输出结果:
加密: Qo3E1B8ZR6Mry99RJm+h41hl/AFpFd6eczi//vidPdleezANZ+3T3DJsqEx3HhRu
解密: {"objectName":"test","pageNo":0,"pageSize":10}
解密前端密文: {"objectName":"test","pageNo":0,"pageSize":10}
Python版本
在 Python 3 中,你可以使用 pycryptodome 库来进行 AES 算法的 ECB 模式和 PKCS5Padding 填充方式的加密和解密。
安装了 pycryptodome 库:
pip install pycryptodome
示例代码:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
# 密钥,用户自定义
key = '1234567890123456';
# 明文
plaintext ='{"objectName":"test","pageNo":0,"pageSize":10}'
# 创建 AES 加密器和解密器
cipher = AES.new(key, AES.MODE_ECB)
decipher = AES.new(key, AES.MODE_ECB)
# 加密
encrypted_text = cipher.encrypt(pad(plaintext.encode('utf-8'), AES.block_size))
encrypted_text_base64 = base64.b64encode(encrypted_text).decode('utf-8')
print('加密后的数据:', encrypted_text_base64)
# 解密
decrypted_text = decipher.decrypt(base64.b64decode(encrypted_text_base64))
decrypted_text = unpad(decrypted_text, AES.block_size).decode('utf-8')
print('解密后的数据:', decrypted_text)
Node.js版本
在 Node.js 中,可以使用 crypto 模块来实现AES 算法的 ECB 模式和 PKCS5Padding 填充方式
const crypto = require('crypto');
function encrypt(text, key) {
const cipher = crypto.createCipheriv('aes-128-ecb', key, '');
cipher.setAutoPadding(true);
let encrypted = cipher.update(text, 'utf8', 'base64');
encrypted += cipher.final('base64');
return encrypted;
}
function decrypt(encryptedText, key) {
const decipher = crypto.createDecipheriv('aes-128-ecb', key, '');
decipher.setAutoPadding(true);
let decrypted = decipher.update(encryptedText, 'base64', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
// 明文
const plaintext ='{"objectName":"test","pageNo":0,"pageSize":10}'
// 密钥,用户自定义
const key = '1234567890123456';
const encrypted = encrypt(plaintext, key)
console.log('加密:', encrypted);
const decrypted = decrypt(encrypted, key)
console.log('解密:', decrypted);
// 解密前端密文,上述js版本AES加密生成
const decrypted2 = 'Qo3E1B8ZR6Mry99RJm+h41hl/AFpFd6eczi//vidPdleezANZ+3T3DJsqEx3HhRu'
console.log('解密前端密文:', decrypt(decrypted2));
欢迎点赞+关注,查看后续更多精彩内容!!!
- 上一篇: 使用 AES 进行加密和解密 - 教程
- 下一篇: Spring Boot数据库密码加密的配置方法
猜你喜欢
- 2025-05-24 网络信息安全之敏感信息在传输、显示时如何加密和脱敏处理
- 2025-05-24 常见加密方式及Python实现
- 2025-05-24 pdf怎么加密
- 2025-05-24 aes256 加密 解密 (python3) 「二」
- 2025-05-24 深入理解Python3密码学:详解PyCrypto库加密、解密与数字签名
- 2025-05-24 Springboot实现对配置文件中的明文密码加密
- 2025-05-24 JavaScript常规加密技术
- 2025-05-24 信息安全人人平等 谷歌推出低性能安卓手机加密技术
- 2025-05-24 SpringBoot与Jasypt整合,实现数据库字段自动加密解密功能
- 2025-05-24 安全性能爆表!Win10 TH2引入XTS-AES加密算法
你 发表评论:
欢迎- 05-24网络信息安全之敏感信息在传输、显示时如何加密和脱敏处理
- 05-24常见加密方式及Python实现
- 05-24pdf怎么加密
- 05-24aes256 加密 解密 (python3) 「二」
- 05-24深入理解Python3密码学:详解PyCrypto库加密、解密与数字签名
- 05-24Springboot实现对配置文件中的明文密码加密
- 05-24JavaScript常规加密技术
- 05-24信息安全人人平等 谷歌推出低性能安卓手机加密技术
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)