示例而已,密钥不敢泄露,可以参考
<template>
<div class="header-container d-flex">
<div>
defineComponent
</div>
</div>
</template>
<script lang="ts">
import { defineComponent } from "vue"
import CryptoJS from 'crypto-js'
export default defineComponent({
setup() {
// 加密密方法
function encryptDesCbcPkcs7Padding(message, key) {
message = JSON.stringify(message)
// message = window.btoa(encodeURIComponent(message))
var keyWords = CryptoJS.enc.Utf8.parse(key)
var ivWords = keyWords
var encrypted = CryptoJS.DES.encrypt(message, keyWords, { iv: ivWords })
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
}
// 解密方法
function decryptDesCbcPkcs7Padding(ciphertext: string, key: string) {
const msg = CryptoJS.enc.Base64.parse(ciphertext)
const keyWords = CryptoJS.enc.Utf8.parse(key)
const ivWords = keyWords
const decrypted = CryptoJS.DES.decrypt({ ciphertext: msg }, keyWords, { iv: ivWords })
const result = decrypted.toString(CryptoJS.enc.Utf8)
// result = decodeURIComponent(result);
const data = JSON.parse(result)
console.log('decryptDesCbcPkcs7Padding')
console.log(msg)
console.log(key)
console.log(keyWords)
console.log(decrypted)
return data
}
const data = {
"status": 0,
"jsonData": "LsrwsvP3x9xtjZ7I2OJkG+M5Ds5Gmg1m2DVJIERLi6arK+hUUPHFAhg+l/BE+OL7tATnDMaHpCAeNEZ9CxdiqMtcG5/sMjiL8u02Iz1P4RnMZOqpUG3dlu8UoXtXhTQot6WW4vGz2Am2sThskG+VYn+m9PW+dnjRsSU5AtBy15X032nTDnT25Qtoc+UoXUyRcNT7C1jtT0H8UzmoGVMWxXzEd1SCFsUO39qWjbydpTwKJvLq4CUIlC7c2UzeGKXkF255U9CHc+bBZdC3RYQmhkYLH+hZqL1RukfonSZ8C6QJ1JQGJyg+FKxXbNn268c1r7dggiVYesR9pWGrdNlYRrzVEYgaxiTjKlOAyj4MGsfBUmuYbCl0WA==",
"msg": null
}
console.log(data)
const ds = decryptDesCbcPkcs7Padding(data.jsonData, "12345678")
console.log(ds)
const ds1 = encryptDesCbcPkcs7Padding(ds, "12345678")
console.log(ds1)
}
})
</script>
<style lang="scss" scoped>
</style>
# puamac added 2022年10月14日 18:07:16
# https://zhuanlan.zhihu.com/p/365008686
import hashlib
import json
from Crypto import Random
from Crypto.Cipher import AES, DES
from binascii import b2a_base64, a2b_base64
import base64
from Crypto.Util.Padding import pad, unpad
DESKEY = '12345678' # 请修改 一定是 16位的字符串
DESIV = '12345678' # 和KEY保持一致即可
BLOCK_SIZE = 16
# 不足BLOCK_SIZE的补位(s可能是含中文,而中文字符utf-8编码占3个位置,gbk是2,所以需要以len(s.encode()),而不是len(s)计算补码)
pad1 = lambda s: s + (BLOCK_SIZE - len(s.encode()) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(s.encode()) % BLOCK_SIZE)
# 去除补位
unpad1 = lambda s: s[:-ord(s[len(s) - 1:])]
class DESTool:
def __init__(self, key, iv):
# self.key = str.encode(key.ljust(16, '0'))
# self.iv = str.encode(iv.ljust(16, '0'))
# self.key = pad(key.encode('utf-8'), 16, style='pkcs7')
# self.iv = pad(iv.encode('utf-8'), 16, style='pkcs7')
# self.key = pad(key.encode('utf-8'), 16, style='pkcs7')
self.key = str.encode(key)
self.iv = str.encode(iv)
self.mode = DES.MODE_CBC
self.pad = "pkcs7"
def pkcs7padding(self, text):
"""
明文使用PKCS7填充
"""
bs = 16
length = len(text)
bytes_length = len(text.encode('utf-8'))
padding_size = length if (bytes_length == length) else bytes_length
padding = bs - padding_size % bs
padding_text = chr(padding) * padding
self.coding = chr(padding)
return text + padding_text
def do_encrypt(self, content):
"""
AES加密
"""
cipher = DES.new(self.key, self.mode, self.iv)
# content = pad1(content)
# 加密
encrypt_bytes = cipher.encrypt(content.encode('utf-8'))
# 重新编码
result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
return result
def do_decrypt(self, content):
"""
AES解密
"""
cipher = DES.new(self.key, self.mode, self.iv)
content = base64.b64decode(content)
text = cipher.decrypt(content).decode('utf-8')
# text = unpad1(text)
return text
des_tool = DESTool(DESKEY, DESIV)
res = {
"status": 0,
"jsonData": "LsrwsvP3x9xtjZ7I2OJkG+M5Ds5Gmg1m2DVJIERLi6arK+hUUPHFAhg+l/BE+OL7tATnDMaHpCAeNEZ9CxdiqMtcG5/sMjiL8u02Iz1P4RnMZOqpUG3dlu8UoXtXhTQot6WW4vGz2Am2sThskG+VYn+m9PW+dnjRsSU5AtBy15X032nTDnT25Qtoc+UoXUyRcNT7C1jtT0H8UzmoGVMWxXzEd1SCFsUO39qWjbydpTwKJvLq4CUIlC7c2UzeGKXkF255U9CHc+bBZdC3RYQmhkYLH+hZqL1RukfonSZ8C6QJ1JQGJyg+FKxXbNn268c1r7dggiVYesR9pWGrdNlYRrzVEYgaxiTjKlOAyj4MGsfBUmuYbCl0WA==",
"msg": "null"
}
de_res = {
"status": 0,
"jsonData": "{\"TotalOrderNum\":289944,\"TotalOrderAmount\":48375120.00,\"cardDataList\":[{\"cardName\":\"单人卡\",\"orderNum\":48594,\"orderAmount\":4859400.00},{\"cardName\":\"三人卡\",\"orderNum\":122493,\"orderAmount\":24498600.00},{\"cardName\":\"双人卡\",\"orderNum\":118857,\"orderAmount\":19017120.00}]}",
"msg": "null"
}
res_des = des_tool.do_decrypt(res["jsonData"])
res = des_tool.do_encrypt(res_des)
print("\n")
print(res_des)
print(res)
print(json.loads(unpad1(res_des)))