如何基于python3和Vue實(shí)現(xiàn)AES數(shù)據(jù)加密
高級(jí)加密標(biāo)準(zhǔn)(AES,Advanced Encryption Standard)為最常見的對(duì)稱加密算法(微信小程序加密傳輸就是用這個(gè)加密算法的)。對(duì)稱加密算法也就是加密和解密用相同的密鑰,具有以下幾個(gè)特點(diǎn):
1、最常用的對(duì)稱加密算法
2、密鑰建立時(shí)間短、靈敏性好、內(nèi)存需求低
3、實(shí)際使用中,使用工作模式為CTR(最好用BC去實(shí)現(xiàn)),此工作模式需要引入IV參數(shù)(16位的字節(jié)數(shù)組)
4、密鑰長(zhǎng)度128/192/256,其中192與256需要配置無政策限制權(quán)限文件(JDK6)
5、填充模式最常用的兩種PKCS5Padding和PKCS7Padding,其中后者只有BC獨(dú)有。
6、加密和解密用到的密鑰是相同的,這種加密方式加密速度非常快,適合經(jīng)常發(fā)送數(shù)據(jù)的場(chǎng)合。
python (ECB)應(yīng)用
安裝:
Windows : pip install pycryptodome
Linux : pip install pycrypto
import base64
import json
import re
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
class AesCrypt(object):
"""
AES 加密組件
"""
def __init__(self, user, is_json=True):
# 這里的密鑰長(zhǎng)度必須是 16 24 32
key = 'suiyi_' + user.get('Auth')
self.is_json = is_json
self.encode_ = 'utf-8'
self.key = self.add_32(key)
print(self.key)
self.aes = AES.new(self.key, AES.MODE_ECB) # 創(chuàng)建一個(gè)aes對(duì)象
def add_32(self, key):
"""
key 補(bǔ)齊32位
:param key:
:return:
"""
# 字符串 a 不要小于32位
a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
key += a
key = key[0:32]
return key.encode(self.encode_)
def aes_encrypt(self, text):
"""
加密 支持 json 需在實(shí)例中制動(dòng) is_json = True
:param text:
:return:
"""
if self.is_json:
text = json.dumps(text, ensure_ascii=False)
text = pad(text.encode('utf-8'), AES.block_size, style='pkcs7')
encrypt_text = self.aes.encrypt(text)
return base64.encodebytes(encrypt_text).decode().strip()
def aes_decrypt(self, text):
"""
解密 支持 json 需在實(shí)例中制動(dòng) is_json = True
:param text:
:return:
"""
text = base64.decodebytes(text.encode(self.encode_))
decrypt_bytes = self.aes.decrypt(text)
decrypt_text = re.compile('[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f\n\r\t]').sub('', decrypt_bytes.decode(
self.encode_))
if self.is_json:
decrypt_text = json.loads(decrypt_text)
return decrypt_text
if __name__ == '__main__':
user = {'Auth': '0000_zhangziyi'}
pr = AesCrypt(user, is_json=True)
data = {"unit": 1, "theme": "cur", "look_detail": True, "zero_empty": True, "zero_hide": True, "data_type": "sum"}
en_text = pr.aes_encrypt(data)
print('密文:', en_text)
pr2 = AesCrypt(user, is_json=True)
print('明文:', pr2.aes_decrypt(en_text))
Vue (ECB)應(yīng)用
安裝:
cnpm install crypto-js --save
import store from '@/store'
import CryptoJS from 'crypto-js/crypto-js'
function add_secret_key (userAuth) {
let key = 'suiyi_' + userAuth
if (key.length < 32) {
let a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
key += a.slice(0, 32 - key.length)
} else if (key.length > 32) {
key = key.slice(0, 32)
}
console.log(key)
return key
}
/**
* 加密
* @param wordimport { aes_encrypt, aes_decrypt } from '../../libs/crypto'
aes_encrypt(this.data)
aes_decrypt(this.AES_data)
* @param userAuth代碼
* @param is_json
* @returns {string}
*/
export const aes_encrypt = (word, userAuth, is_json = true) => {
if (is_json) {
word = JSON.stringify(word)
}
var key = CryptoJS.enc.Utf8.parse(add_secret_key(userAuth)) // s/iqSaaE0F3tsLgMCkCZjvqptKKzqD9/pMUnMkCwNjg= Set
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()
}
/**
* 解密
* @param word
* @param userAuth
* @param is_json
* @returns {string}
*/
export const aes_decrypt = (word, userAuth, is_json = true) => {
var key = CryptoJS.enc.Utf8.parse(add_secret_key(userAuth))// s/iqSaaE0F3tsLgMCkCZjvqptKKzqD9/pMUnMkCwNjg= Set
var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
let decrypt_text = CryptoJS.enc.Utf8.stringify(decrypt).toString()
if (is_json) {
decrypt_text = JSON.parse(decrypt_text)
}
return decrypt_text
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python?實(shí)現(xiàn)一個(gè)全連接的神經(jīng)網(wǎng)絡(luò)
這篇文章主要介紹了Python?實(shí)現(xiàn)一個(gè)全連接的神經(jīng)網(wǎng)絡(luò),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06
python部署chineseocr_lite的實(shí)現(xiàn)示例
本文主要介紹了python部署chineseocr_lite的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
基于Python實(shí)現(xiàn)簡(jiǎn)單的學(xué)生點(diǎn)名系統(tǒng)
現(xiàn)在的學(xué)生大部分都很積極,會(huì)主動(dòng)舉手回答問題。但是,也會(huì)遇到一些不好的情況,比如年級(jí)越高主動(dòng)舉手的人越少,所以本文做了一個(gè)隨機(jī)的學(xué)生點(diǎn)名系統(tǒng)可以幫老師解決這些問題2022-09-09
Python range函數(shù)之生成器函數(shù)的示例
這篇文章主要介紹了Python range函數(shù)之生成器函數(shù)的示例,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
淺談python 讀excel數(shù)值為浮點(diǎn)型的問題
今天小編就為大家分享一篇淺談python 讀excel數(shù)值為浮點(diǎn)型的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12
flask連接并操作數(shù)據(jù)庫的實(shí)現(xiàn)示例
本文詳細(xì)介紹了在Flask框架中連接并操作數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12

