crypto.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import CryptoJS from 'crypto-js'
  2. // 配置参数
  3. const MODE_CBC = "CBC"
  4. const PADDING_MODE = "PKCS7Padding"
  5. const DEFAULT_IV = "@ZiyiTechProduct"
  6. const AES_DEFAULT_KEY = "ZiyiTechPro#2025"
  7. // AES-CBC 加密(输出Hex字符串)
  8. export function encryptAESCBC(data) {
  9. const key = CryptoJS.enc.Utf8.parse(AES_DEFAULT_KEY)
  10. const iv = CryptoJS.enc.Utf8.parse(DEFAULT_IV)
  11. // 统一将输入转为字符串
  12. const plaintext = typeof data === 'object'
  13. ? JSON.stringify(data)
  14. : String(data)
  15. // 加密并输出Hex字符串
  16. const encrypted = CryptoJS.AES.encrypt(
  17. plaintext,
  18. key,
  19. {
  20. iv: iv,
  21. mode: CryptoJS.mode.CBC,
  22. padding: CryptoJS.pad.Pkcs7
  23. }
  24. ).ciphertext.toString(CryptoJS.enc.Hex) // 直接提取二进制密文转为Hex
  25. return encrypted
  26. }
  27. // AES-CBC 解密(处理Hex字符串输入)
  28. export function decryptAESCBC(encryptedHex) {
  29. const key = CryptoJS.enc.Utf8.parse(AES_DEFAULT_KEY)
  30. const iv = CryptoJS.enc.Utf8.parse(DEFAULT_IV)
  31. // 将Hex字符串解析为CryptoJS的密文对象
  32. const ciphertext = CryptoJS.enc.Hex.parse(encryptedHex)
  33. const encryptedData = { ciphertext: ciphertext }
  34. // 解密
  35. const decrypted = CryptoJS.AES.decrypt(
  36. encryptedData,
  37. key,
  38. {
  39. iv: iv,
  40. mode: CryptoJS.mode.CBC,
  41. padding: CryptoJS.pad.Pkcs7
  42. }
  43. )
  44. // 统一输出为字符串(自动处理JSON或普通字符串)
  45. const decryptedStr = decrypted.toString(CryptoJS.enc.Utf8)
  46. try {
  47. return JSON.parse(decryptedStr)
  48. } catch {
  49. return decryptedStr
  50. }
  51. }