前言
為破解前端加密做准備,先了解一些常見的加密算法
分類
- 對稱加密
采用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單密鑰加密。
DES
DES 算法把 64 位(8 字節)的明文輸入塊變為 64 位的密文輸出塊(分組加密),它所使用的密鑰也是 64 位(不足 64 位會自動補齊)
弊端:只能加密最大 64 位數據
關鍵參數:密鑰 key
JS 實現:
<script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<script>
//DES 加密
function encryptByDES(message, key){
var keyHex = CryptoJS.enc.Utf8.parse(key);
var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.ciphertext.toString();
}
//DES 解密
function decryptByDES(ciphertext, key){
var keyHex = CryptoJS.enc.Utf8.parse(key);
var decrypted = CryptoJS.DES.decrypt({
ciphertext: CryptoJS.enc.Hex.parse(ciphertext)
}, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
var result_value = decrypted.toString(CryptoJS.enc.Utf8);
return result_value;
}
</script>
//調用
<script>
var message = '111111';//需要加密的數據
var key = '12345678';//加密密鑰 key
var desMessage = 'xxxxxxxxxx';
//加密
desMessage = encryptByDES(message, key);
console.log(desMessage);
//解密
message = decryptByDES(desMessage,key)
console.log(message);
</script>
可以看到,加解密時最重要的一個東西便是密鑰 key
AES
DES 的升級替代品,AES 為分組密碼,分組密碼也就是把明文分成一組一組的,每組長度相等,每次加密一組數據,直到加密完整個明文。
在 AES 標准規范中,分組長度只能是 128 位,也就是說,每個分組為 16 個字節(每個字節 8 位)。密鑰的長度可以使用 128 位、192 位或 256 位。密鑰的長度不同,推薦加密輪數也不同
關鍵參數:密鑰 key,偏移量 iv
JS 實現:
//首先要引入 https://github.com/sytelus/CryptoJS 中的兩個文件
<script src="./rollups/aes.js"></script>
<script src="./components/pad-zeropadding.js"></script>//這個文件不是固定的,需要根據不同的填充方式而更改
<script>
function encryptByAES(data, key, iv){
var key = CryptoJS.enc.Latin1.parse(key);
var iv = CryptoJS.enc.Latin1.parse(iv);
var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
return encrypted.ciphertext.toString();
}
function decryptByAES(data, key, iv){
var key = CryptoJS.enc.Latin1.parse(key);
var iv = CryptoJS.enc.Latin1.parse(iv);
var decrypted = CryptoJS.AES.decrypt(data,key,{iv:iv,padding:CryptoJS.pad.ZeroPadding});
return decrypted.ciphertext.toString();
}
</script>
- 非對稱加密
非對稱加密算法需要兩個密鑰:公開密鑰(publickey:簡稱公鑰)和私有密鑰(privatekey:簡稱私鑰)。公鑰與私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。
在公開密鑰密碼體制中,加密密鑰(即公開密鑰)PK 是公開信息,而解密密鑰(即秘密密鑰)SK是需要保密的。加密算法E和解密算法D也都是公開的。雖然解密密鑰 SK 是由公開密鑰 PK 決定的,但卻不能根據 PK 計算出 SK。
RSA
RSA 公開密鑰密碼體制的原理是:根據數論,尋求兩個大素數比較簡單,而將它們的乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰
關鍵參數:公鑰 PUBLIC_KEY,私鑰 PRIVATE_KEY
JS 實現:
<script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>
<script>
var PUBLIC_KEY = '公鑰';
var PRIVATE_KEY = '私鑰';
var message = 'xxxxxxx';
var encryptmsg = 'testtest';
//使用公鑰加密
function encryptByRSA(data, pub_key){
var encrypt = new JSEncrypt();
encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + pub_key + '-----END PUBLIC KEY-----');
var encrypted = encrypt.encrypt(data);
return encrypted;
}
//使用私鑰解密
function decryptByRSA(data, pri_key){
var decrypt = new JSEncrypt();
decrypt.setPrivateKey('-----BEGIN RSA PRIVATE KEY-----'+ pri_key +'-----END RSA PRIVATE KEY-----');
var decrypted = decrypt.decrypt(encrypted);
return decrypted;
}
</script>