AES 前後端加密互通
JavaScript, C#, AES, encrtyption, encrypt, 加密,
引言
開發平台
前端
後端
關鍵程式碼
前端
import * as CryptoJS from 'crypto-js'
/**
* AES 256 CBC 加密器
* @param plaintext 明文
* @param key 金鑰,需 64 個 HEX 數字
* @param iv 初始向量,需 32 個 HEX 數字
* @returns
*/
export function encrypt(plaintext: string, key: string, iv: string) {
const keyBytes = CryptoJS.enc.Hex.parse(key)
const ivBytes = CryptoJS.enc.Hex.parse(iv)
const encodeAdv = generateRandom32String() + plaintext;
const plainBlob = CryptoJS.enc.Utf8.parse(encodeAdv)
const cipherBlob = CryptoJS.AES.encrypt(plainBlob, keyBytes, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: ivBytes })
const ciphertext = cipherBlob.toString()
return ciphertext
}
/**
* AES 256 CBC 解密器
* @param ciphertext 密文
* @param key 金鑰,需 64 個 HEX 數字
* @param iv 初始向量,需 32 個 HEX 數字
* @returns
*/
export function decrypt(ciphertext: string, key: string, iv: string) {
const keyBytes = CryptoJS.enc.Hex.parse(key)
const ivBytes = CryptoJS.enc.Hex.parse(iv)
const decryptedBlob = CryptoJS.AES.decrypt(ciphertext, keyBytes, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: ivBytes })
const decryptedText = CryptoJS.enc.Utf8.stringify(decryptedBlob)
const decodeAdv = decryptedText.slice(32)
return decodeAdv
}
/**
* 生成一個 32 字元長度的隨機字串
* @returns
*/
function generateRandom32String() {
const randomWords = CryptoJS.lib.WordArray.random(24);
return randomWords.toString(CryptoJS.enc.Base64);
}後端
密碼格式
Last updated