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 pycryptodomepycryptodome 庫是對 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 中的經典演算法,資料探勘十大經典演...