Python3 與 VUE的 AES加密解密

目錄

簡介

VUE的AES加密

Python AES加密

注意


密碼學中的高級加密標準(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES(Data Encryption Standard),已經被多方分析且廣爲全世界所使用。經過五年的甄選流程,高級加密標準由美國國家標準與技術研究院 (NIST)於2001年11月26日發佈於FIPS PUB 197,並在2002年5月26日成爲有效的標準。2006年,高級加密標準已然成爲對稱密鑰加密中最流行的算法之一 [1]  。該算法爲比利時密碼學家Joan Daemen和Vincent Rijmen所設計,結合兩位作者的名字,以Rijdael之名命之,投稿高級加密標準的甄選流程。(Rijdael的發音近於 "Rhine doll"。)(摘取百度百科)

簡介

AES擁有很多模式,而此次採用的CBC模式:用key和iv(初始向量,加密第一塊明文), 再加上擾碼(隨機數)(由於樓主比較懶,這裏只列CBC和ECB的例子)

VUE的AES加密

  •  在vue項目中index.html引入crypto
<script src="https://cdn.bootcss.com/crypto-js/3.1.9/crypto-js.min.js"></script>
  • 在webpack.base.conf.js修改
  externals:{
      'crypto':'Crypto',
  },
  • 在src目錄下創建文件index.js
/**
 * 工具類
 */
export default {//加密
  set(word, keyStr){
    keyStr = keyStr ? keyStr : 'abcdefghijklmnop';
    var key  = CryptoJS.enc.Utf8.parse(keyStr);//Latin1 w8m31+Yy/Nw6thPsMpO5fg==
    var srcs = CryptoJS.enc.Utf8.parse(word);
    var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
    return encrypted.toString();
  },
  //解密
  get(word, keyStr){
    keyStr = keyStr ? keyStr : 'abcdefghijklmnop';
    var key  = CryptoJS.enc.Utf8.parse(keyStr);//Latin1 w8m31+Yy/Nw6thPsMpO5fg==
    var decrypt = CryptoJS.AES.decrypt(word, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
    return CryptoJS.enc.Utf8.stringify(decrypt).toString();
  }

}
  • 在需要使用的頁面中導入
import Crypto from "@/index";

let str = Crypto.get("好好學習")
console.log("暗文:" + str)
let str1 = Crypto.set(str)
console.log("明文: " + str1)

Python AES加密

  • 下載依賴庫pycryptodome,請手動輸入下載,之前默認的庫已經over了
pip install pycryptodome
  • 若仍導入失敗,在site-packages目錄下手動修改crypto文件名爲Crypto,沒錯,沒有看錯,手動修改
from Crypto.Cipher import AES
import base64

from Crypto.Util.Padding import pad


class AesCrypt:
    def __init__(self, model, iv, encode_, key='abcdefghijklmnop'):
        self.encrypt_text = ''
        self.decrypt_text = ''
        self.encode_ = encode_
        self.model = {'ECB': AES.MODE_ECB, 'CBC': AES.MODE_CBC}[model]
        self.key = self.add_16(key)
        if model == 'ECB':
            self.aes = AES.new(self.key, self.model)  # 創建一個aes對象
        elif model == 'CBC':
            self.aes = AES.new(self.key, self.model, iv)  # 創建一個aes對象

        # 這裏的密鑰長度必須是16、24或32,目前16位的就夠用了

    def add_16(self, par):
        par = par.encode(self.encode_)
        while len(par) % 16 != 0:
            par += b'\x00'
        return par

    # 加密
    def aesencrypt(self, text):
        text = pad(text.encode('utf-8'), AES.block_size, style='pkcs7')
        self.encrypt_text = self.aes.encrypt(text)
        return base64.encodebytes(self.encrypt_text).decode().strip()

    # 解密
    def aesdecrypt(self, text):
        text = base64.decodebytes(text.encode(self.encode_))
        self.decrypt_text = self.aes.decrypt(text)
        return self.decrypt_text.decode(self.encode_).strip('\0').strip("\n")


if __name__ == '__main__':
    pr = AesCrypt('ECB', '', 'utf-8', 'abcdefghijklmnop')
    pr1 = AesCrypt("ECB", "", "utf-8")
    en_text = pr.aesencrypt('123456')
    print('密文:', en_text)
    print('明文:', pr1.aesdecrypt(en_text))

注意

要保證vue和python加密後的密文一隻,必須保證加密模式,偏移量,祕鑰等全部一致

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章