1演算法加密 js JS和Python實現AES演算法

2021-10-16 04:41:00 字數 3795 閱讀 2035

aes演算法是典型的對稱加密演算法,aes原理可以學習這兩篇文件:

ecb模式比較簡單,不需要偏移量,本文都是以cbc模式為例。

用js實現aes演算法(基於nodejs的crypto-js庫,或者通過匯入aes.js,cbc模式,base64編碼)

用python實現aes演算法(基於cryptodemo模組,cbc模式,16進製制ascii編碼和base64編碼兩種處理加密結果)

加密明文均相容中文,js與python實現的aes演算法結果一致

npm install crypto-js

// test.js,base64編碼,`node test`執行const cryptojs = require("crypto-js");var key ="0cojum6qyw8w8jud";var iv = "0102030405060708";function encrypt(text))}function decrypt(text))    return result.tostring(cryptojs.enc.utf8)}var text="小眯嘻";var encoded=encrypt(text)console.log(encoded.tostring());console.log(decrypt(encoded))
匯入 aes.js 指令碼,也能直接使用

www.jb51.net aes.js
pip install pycryptodome

pycryptodome 庫是對 pycrypto 庫的擴充套件

from crypto.cipher import aesfrom binascii import b2a_hex, a2b_hex# 如果text不足16位的倍數就用空格補足為16位# 不同於js,pycryptodome庫中加密方法不做任何padding,因此需要區分明文是否為中文的情況def add_to_16(text):    pad = 16 - len(text.encode('utf-8')) % 16    text = text + pad * chr(pad)    return text.encode('utf-8')# 加密函式def encrypt(text, key, mode, iv):    text = add_to_16(text)    cryptos = aes.new(key, mode, iv)    cipher_text = cryptos.encrypt(text)    return b2a_hex(cipher_text).decode('utf-8')def decrypt(text, key, mode, iv):    cryptos = aes.new(key, mode, iv)    text = a2b_hex(text)    plain_text = cryptos.decrypt(text)    # return plain_text.decode('utf-8')    return bytes.decode(plain_text)if __name__ == '__main__':    key = '0cojum6qyw8w8jud'.encode('utf-8')    mode = aes.mode_cbc    iv = '0102030405060708'.encode('utf-8')    text = "小眯嘻的部落格123"    e = encrypt(text, key, mode, iv)  # 加密    print("加密後:", e)    d = decrypt(e, key, mode, iv)  # 解密    print("解密後:", d)
encode() 和 decode() 方法用於字串與 bytes 的互相轉換。binascii模組包含很多用來方法來轉換二進位制和各種ascii編碼的二進位制表示法,其中 b2a_hex() 和 a2b_hex() 方法用於 bytes 與 16進製制ascii 的互相轉換。

python的內建函式 bytes() 可以將字串str型別轉換成bytes型別,必須明確encoding的引數,不可省略。而如果字串內容都是 ascii 字元,則可以通過直接在字串之前新增 'b' 來構建位元組串值,就能直接將乙個字串轉換成 bytes 物件。同樣的,bytes轉為字串,python3中的內建函式ascii()返回乙個字串物件,如果引數中有非ascii字元,會用 u,u,x 來替代。

encrypt() 和 decrypt() 方法返回的結果是bytes型別。因為輸出的bytes中的位元組不一定能與ascii字符集對應的上,因此先將bytes轉換為16進製制的ascii,便於儲存輸出結果。

python中的基本使用

# 編碼》 base64.b64encode(b'/x01') # 想象它是一張,編碼成 base64 之後,就能進行傳輸b'l3gwmq=='# 解碼》 base64.b64decode(b'l3gwmq==') # 傳輸成功之後,在把解碼回來變成一張b'/x01'
前面的aes演算法中,如果將加密結果轉成base64位,

import base64from crypto.cipher import aesfrom binascii import b2a_hex, a2b_hex# 如果text不足16位的倍數就用空格補足為16位# 不同於js,pycryptodome庫中加密方法不做任何padding,因此需要區分明文是否為中文的情況def add_to_16_cn(text):    pad = 16 - len(text.encode('utf-8')) % 16    text = text + pad * chr(pad)    return text.encode('utf-8')# 加密函式def encrypt(text, key, mode, iv):    text = add_to_16_cn(text)    cryptos = aes.new(key, mode, iv)    cipher_text = cryptos.encrypt(text)    # return b2a_hex(cipher_text).decode('utf-8')    return base64.b64encode(cipher_text).decode('utf-8') #base編碼def decrypt(text, key, mode, iv):    cryptos = aes.new(key, mode, iv)    # text = a2b_hex(text)    text = base64.b64decode(text) #base64解碼    plain_text = cryptos.decrypt(text)    return plain_text.decode('utf-8')if __name__ == '__main__':    key = '0cojum6qyw8w8jud'.encode('utf-8')    mode = aes.mode_cbc    iv = '0102030405060708'.encode('utf-8')    text = "小眯嘻的部落格123"    e = encrypt(text, key, mode, iv)  # 加密    print("加密後:", e)    d = decrypt(e, key, mode, iv)  # 解密    print("解密後:", d)
驗證一下,js與python實現的aes演算法,結果一致,且能相容中文的。

php加密解密演算法1

str trim post mystr key trim post mykey act get act echo authcode str,act,key,100 string 明文 或 密文 operation decode表示解密,其它表示加密 key 密匙 expiry 密文有效期 funct...

RSA加密演算法(1)

rsa加密演算法是一種非對稱加密演算法。極大整數做因數分解的難度 1 乙個正整數寫成幾個約數的乘積 2 完整的因子列表可以根據約數分解推導出,將冪從零不斷增加直到等於這個數。如 45 的兩大約數 為 3 和 5。3 給出兩個大約數,很容易就能將它們兩個相乘。但是,給出它們的乘積,找出它們的因子就顯得...

聚類演算法之Kmean演算法應用和Python應用舉例

聚類演算法之 kmean演算法應用和python應用舉例 參考 1.歸類 聚類 clustering 屬於非監督學習 unsupervised learning 無類別標記 class label 2.舉例 3.k means 演算法 3.1 clustering 中的經典演算法,資料探勘十大經典演...