題目👇
(1)使用cryptography模塊,撰寫完整的AES-CBC加解密函式,函式介面為:
def encrypt_CBC(key, plaintext, iv)、def decrypt_CBC(key, ciphertext, iv);
(2)使用pycryptodome模塊,撰寫程式,實作RSA-OAEP加解密;
知識補充👇
(1)AES是高級加密標準(Advanced Encryption Standard)的縮寫,AES是最常見的對稱加密演算法,
對稱加密演算法也就是加密和解密用相同的密鑰,同一個秘鑰即用來加密,也用來解密,
關于加密解密的原理可以搜索一下相關的文章,
RSA是一種典型的非對稱密鑰密碼體制,從加密密鑰和解密密鑰中的任何一個推匯出另一個在計算上是不可行的,RSA的安全性建立在“大數分解和素性檢測”這一著名數論難題的基礎上,
公鑰對可以完全公開,不需要進行保密,但必須提供完整性檢測機制以保證不受篡改;
私鑰由用戶自己保存,通信雙方無需實作交換密鑰就可以進行保密通信,
(2)RSA密碼體制演算法如下:
由用戶選擇兩個互異并且距離較遠的大素數p和q;
計算n=p×q和f(n)=(p-1)×(q-1);
選擇正整數e,使其與f(n)的最大公約數為1;
然后計算正整數d,使得e×d 對f(n)的余數為1,即e×d≡1 mod f(n),最后銷毀p和q,
經過以上步驟,得出公鑰對(n,e)和私鑰對(n,d),
設M為明文,C為對應的密文,
則加密變換為:C=M^e mod n;
解密變換為:M=C^d mod n,
安裝使用👇
在python中,擴展庫pycrypto、pycryptodome和cryptography提供了SHA系列演算法和RIPEMD160等多個安全哈希演算法,以及 DES、AES、RSA、DSA、ElGamal等多個加密演算法和數字簽名演算法的實作,
crypto這個模塊的安裝比較特殊,可能會有點小坑,安裝時需要注意!
crypto,pycrypto,pycryptodome這三個python中密碼學相關模塊的功能是一樣的,
但是crypto與pycrypto已經沒有維護了,所以推薦使用pycryptodome,
而且這幾個模塊的適用性不同,分Linux和Windows作業系統,還分Python2和Python3......
在 Windows 中,不管是 Python2 和 Python3 ,都不能用 crypto 和 pycrypto ,只能用 pycryptodome模塊進行密碼學編程,
在 Linux 中,不管是 Python2 和 Python3 ,都不能用 crypto ,只能用 pycrypto 和 pycryptodome ,
下面是windows系統下Python3的安裝教程,安裝之前,最好先把 crypto 和 pycrypto 卸載了,否則命令列會報好多紅字的錯誤,
安裝命令如下:
pip uninstall crypto
pip uninstall pycrypto
pip install pycryptodome
代碼示例👇
#coding:utf-8
#author:Mitchell
#使用cryptography模塊,撰寫完整的AES-CBC加解密函式,函式介面為:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Util.Padding import unpad
from Crypto.Random import get_random_bytes
def encrypt_CBC(key, plaintext, iv):
#實體化加密套件,使用CBC模式
cipher = AES.new(key, AES.MODE_CBC, iv)
#對內容進行加密,pad函式用于分組和填充
encrypted_data = cipher.encrypt(pad(plaintext, AES.block_size))
return encrypted_data
def decrypt_CBC(key, ciphertext, iv):
cipher = AES.new(key, AES.MODE_CBC, iv)
tmp = cipher.decrypt(ciphertext)
decrypted_data = unpad(tmp, AES.block_size)
return decrypted_data
data = b"I love sdu" #要加密的內容
print("原始明文=",data)
key = get_random_bytes(16) #隨機生成16位元組(即128位)的加密密鑰
iv = get_random_bytes(16)
encrypted_data=encrypt_CBC(key,data,iv)
print("AES加密后的密文=",encrypted_data)
decrypted_data=decrypt_CBC(key,encrypted_data,iv)
print("AES解密后的明文=",decrypted_data)
#使用pycryptodome模塊,撰寫程式,實作RSA-OAEP加解密;
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
#生成密鑰
key = RSA.generate(1024)
#提取私鑰
private_key = RSA.import_key(key.export_key())
print("私鑰=",private_key)
#提取公鑰
public_key = RSA.import_key(key.publickey().export_key())
print("公鑰=",public_key)
data = b"I love sdu"
print("原始明文=",data)
#實體化加密套件
cipher = PKCS1_OAEP.new(public_key)
#加密
encrypted_data = cipher.encrypt(data)
print("RSA加密后的密文=",encrypted_data)
#實體化解密套件
cipher = PKCS1_OAEP.new(private_key)
#解密
decrypted_data = cipher.decrypt(encrypted_data)
print("RSA解密后的明文=",decrypted_data)
運行效果👇
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/393150.html
標籤:python
