python 和vue 加解密

16 篇文章 0 订阅

示例而已,密钥不敢泄露,可以参考


<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)))
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值