AES 前後端加密互通

JavaScript, C#, AES, encrtyption, encrypt, 加密,

引言

因需求需在 Web App 前後端加解密加通。就是前端加密後端解密。後端加密前端解密。

開發平台

前端
後端

程式語言

JavaScript/TypeScript

C#

執行平台

node.js/react 18

NET Framework 4.8

加密方法

AES CBC 256

AES CBC 256

加密套件

"crypto-js": "^4.2.0"

System.Security.Cryptography;

關鍵程式碼

前端

aesHelper.ts
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);
}

後端

密碼格式

本例密碼選用 HEX 字串,所以 Key 長度 64;IV 長度 32。

(EOF)

Last updated