前端:
crypto-js (Github链接:https://github.com/brix/crypto-js/tree/master)
crypto-js 安装:
npm install crypto-js
使用:
aesEncrypt(str) {
let aesPrivateKey = "1111111111111111";
var key = CryptoJS.enc.Utf8.parse(aesPrivateKey);
var srcs = CryptoJS.enc.Utf8.parse(str);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7});
return encrypted.toString();
}
后端Python解密和加密:
"""
ECB没有偏移量
"""
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
from Crypto import Random
import base64
key = '1111111111111111'
# def add_to_16(text):
# if len(text.encode('utf-8')) % 16:
# add = 16 - (len(text.encode('utf-8')) % 16)
# else:
# add = 0
# text = text + ('\0' * add)
# return text.encode('utf-8')
#
#
# # 加密函数
# def encrypt(text):
#
# mode = AES.MODE_ECB
# text = add_to_16(text)
# cryptos = AES.new(key, mode)
#
# cipher_text = cryptos.encrypt(text)
# return b2a_hex(cipher_text)
BLOCK_SIZE = 16 # Bytes
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \
chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
def aesEncrypt(key, data):
'''
AES的ECB模式加密方法
:param key: 密钥
:param data:被加密字符串(明文)
:return:密文
'''
key = key.encode('utf8')
# 字符串补位
data = pad(data)
cipher = AES.new(key, AES.MODE_ECB)
# 加密后得到的是bytes类型的数据,使用Base64进行编码,返回byte字符串
result = cipher.encrypt(data.encode())
encodestrs = base64.b64encode(result)
enctext = encodestrs.decode('utf8')
print(enctext)
return enctext
def aesDecrypt(key, data):
'''
:param key: 密钥
:param data: 加密后的数据(密文)
:return:明文
'''
key = key.encode('utf8')
data = base64.b64decode(data)
cipher = AES.new(key, AES.MODE_ECB)
# 去补位
text_decrypted = unpad(cipher.decrypt(data))
text_decrypted = text_decrypted.decode('utf8')
# print(text_decrypted)
return text_decrypted
if __name__ == '__main__':
data = 'hello world'
ecdata = aesEncrypt(key, data)
aesDecrypt(key, ecdata)
注意点:前端加密模式和后端解密模式要一致,否则将无法解密。博主选择的是ECB模式