使用JavaScript实现数据加密和解密
数据加密和解密是信息安全领域非常重要的一部分。在网络通信、数据存储和传输等场景中,加密和解密可以保护数据的机密性、完整性和可用性,防止数据被窃取、篡改或破坏。本文将介绍如何使用JavaScript实现数据加密和解密,包括对称加密和非对称加密两种方式。
1. 对称加密
对称加密是一种加密方式,使用相同的密钥对数据进行加密和解密。对称加密算法的特点是加密速度快,适合对大量数据进行加密和解密,但密钥的安全性需要保证。在对称加密中,常用的加密算法有DES、3DES、AES等。1.1 DES加密算法
DES(Data Encryption Standard)是一种对称加密算法,它使用56位密钥对数据进行加密和解密。DES加密算法的过程包括初始置换、16轮迭代、逆置换等步骤。下面是使用JavaScript实现DES加密和解密的示例代码:
// DES加密算法
function desEncrypt(data, key) {
// 将密钥转换为二进制数组
var keyBytes = stringToBytes(key);
// 将数据转换为二进制数组
var dataBytes = stringToBytes(data);
// 进行DES加密
var encBytes = CryptoJS.DES.encrypt({ ciphertext: dataBytes }, keyBytes, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).ciphertext;
// 将加密结果转换为Base64字符串
var encData = bytesToBase64(encBytes);
return encData;
}
// DES解密算法
function desDecrypt(encData, key) {
// 将密钥转换为二进制数组
var keyBytes = stringToBytes(key);
// 将加密数据转换为二进制数组
var encBytes = base64ToBytes(encData);
// 进行DES解密
var decBytes = CryptoJS.DES.decrypt({ ciphertext: encBytes }, keyBytes, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).plaintext;
// 将解密结果转换为字符串
var decData = bytesToString(decBytes);
return decData;
}
// 将字符串转换为二进制数组
function stringToBytes(str) {
var bytes = [];
for (var i = 0; i < str.length; i++) {
bytes.push(str.charCodeAt(i));
}
return bytes;
}
// 将二进制数组转换为Base64字符串
function bytesToBase64(bytes) {
var binary = "";
for (var i = 0; i < bytes.length; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
// 将Base64字符串转换为二进制数组
function base64ToBytes(base64) {
var binary = atob(base64);
var bytes = new Uint8Array(binary.length);
for (var i = 0; i < binary.length; i++) {
bytes[i] = binary.charCodeAt(i);
}
return bytes;
}
// 将二进制数组转换为字符串
function bytesToString(bytes) {
var str = "";
for (var i = 0; i < bytes.length; i++) {
str += String.fromCharCode(bytes[i]);
}
return str;
}
1.2 AES加密算法
AES(Advanced Encryption Standard)是一种对称加密算法,它使用128位、192位或256位密钥对数据进行加密和解密。AES加密算法的过程包括密钥扩展、初始轮、9轮加密、最后一轮加密等步骤。下面是使用JavaScript实现AES加密和解密的示例代码:
// AES加密算法
function aesEncrypt(data, key) {
// 将密钥转换为二进制数组
var keyBytes = stringToBytes(key);
// 将数据转换为二进制数组
var dataBytes = stringToBytes(data);
// 进行AES加密
var encBytes = CryptoJS.AES.encrypt({ ciphertext: dataBytes }, keyBytes, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).ciphertext;
// 将加密结果转换为Base64字符串
var encData = bytesToBase64(encBytes);
return encData;
}
// AES解密算法
function aesDecrypt(encData, key) {
// 将密钥转换为二进制数组
var keyBytes = stringToBytes(key);
// 将加密数据转换为二进制数组
var encBytes = base64ToBytes(encData);
// 进行AES解密
var decBytes = CryptoJS.AES.decrypt({ ciphertext: encBytes }, keyBytes, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).plaintext;
// 将解密结果转换为字符串
var decData = bytesToString(decBytes);
return decData;
}
2. 非对称加密
非对称加密是一种加密方式,使用一对公钥和私钥对数据进行加密和解密。公钥可以公开发布,任何人都可以使用公钥对数据进行加密,但只有私钥的持有者才能解密。非对称加密算法的特点是安全性高,但加密速度慢,适合对少量数据进行加密和解密。在非对称加密中,常用的加密算法有RSA、ECC等。2.1 RSA加密算法
RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用一对公钥和私钥对数据进行加密和解密。RSA加密算法的过程包括密钥生成、加密、解密等步骤。下面是使用JavaScript实现RSA加密和解密的示例代码:
// 生成RSA密钥对
var keyPair = cryptico.generateRSAKey('passphrase', 1024);
// 获取公钥和私钥
var publicKey = cryptico.publicKeyString(keyPair);
var privateKey = cryptico.privateKeyString(keyPair);
// RSA加密算法
function rsaEncrypt(data, publicKey) {
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
var encData = encrypt.encrypt(data);
return encData;
}
// RSA解密算法
function rsaDecrypt(encData, privateKey) {
var decrypt = new JSEncrypt();
decrypt.setPrivateKey(privateKey);
var decData = decrypt.decrypt(encData);
return decData;
}