对称加密的逻辑:

  • 加密和解密的密钥相同;
  • 最常见的对称加密:AES、DES、3DES 加密;
  • 不需要研究加密算法,各个语言都有库。

python 的对称加密

  • 需要安装 pycryptodemo 库:pip install pycryptodemo
  • 如果包文件夹是小写 c 改成大写就好了

加密过程:

from Crypto.Cipher import AES
import base64
from Crypto.Util.Padding import pad, unpad

ming = "这是aes加密"
key = b"8888888888888888"
iv = b"1234567887654321"

aes = AES.new(key=key, iv=iv, mode=AES.MODE_CBC)
ming_bs = pad(ming.encode("utf-8"), 16)
mi_bs = aes.encrypt(ming_bs)

b64str = base64.b64encode(mi_bs).decode()
print(b64str)

解密过程:

key = b"8888888888888888"
iv = b"1234567887654321"
mi = "XeVBKJQiBgfUwrlIqNbehg=="
aes = AES.new(key=key, iv=iv, mode=AES.MODE_CBC)
mi_bs = base64.b64decode(mi)
ming_bs = aes.decrypt(mi_bs)
ming_bs = unpad(ming_bs, 16)
print(ming_bs.decode("utf-8"))

JS 的对称加密

  • 需要安装 CryptoJS 库:npm install crypto-js

加密过程:

var CryptoJS = require("crypto-js")

var key = "8888888888888888"
var iv = "1234567887654321"
var ming = "这是js的aes"

var key_bs = CryptoJS.enc.Utf8.parse(key)
var iv_bs = CryptoJS.enc.Utf8.parse(iv)
var ming_bs = CryptoJS.enc.Utf8.parse(ming)

var mi_bs = CryptoJS.AES.encrypt(ming_bs, key_bs, {
    iv: iv_bs,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
})

console.log(CryptoJS.enc.Base64.stringify(mi_bs.ciphertext))
console.log(mi_bs.toString()) // 这两行是等价的

解密过程:

var mi = "y19TZLc0G/7iTY0zGlPj/A=="

var key_bs = CryptoJS.enc.Utf8.parse(key)
var iv_bs = CryptoJS.enc.Utf8.parse(iv)

var res = CryptoJS.AES.decrypt(mi, key_bs, {
    iv: iv_bs,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
})

console.log(res.toString(CryptoJS.enc.Utf8))
console.log(CryptoJS.enc.Utf8.stringify(res)) // 这两行是等价的