共计 2766 个字符,预计需要花费 7 分钟才能阅读完成。
引入
考核项目中用到的加解密模块, 测试一下并记录过程, 主要测试 AES(对称加密) & RSA(公钥加密)
一. 安装
1.windows 下安装
pip install pycryptodome
2.linux 下安装
pycrypto
二.AES 加解密
- AES : 高级加密标准, 它是一种对称加密算法,AES 只有一个密钥,这个密钥既用来加密,也用于解密 (详细介绍自行百度)
- AES 加密模式有五种 : ECB, CBC, CTR, CFB, OFB (本文值介绍推荐且常用的前两种)
1.ECB 模式
ECB 加密需要传入一个秘钥 key
AES key must be either 16, 24, or 32 bytes long
(秘钥的长度必须是 16/24/32)
- 测试
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
base_pwd = b"123456"
# AES 秘钥程度必须是 16/24/32 位
key = get_random_bytes(16)
print(key) # b'\x93\xe4Knbw2\xcb\x03\r\x95B\x012\x8aj'
# 加密
# 通过 AES 初始化秘钥字符串, 得到 Cipher 对象
cipher = AES.new(key, AES.MODE_ECB)
# 输入需要加密的密码, 长度是 16 的倍数, 返回加密后的字符串
# 注意: 如果需要加密的密码长度不是 16 会报错, 可以使用 pad 来填充
pad_pwd = pad(base_pwd, AES.block_size) # block_size=16
print(pad_pwd) # b'123456\n\n\n\n\n\n\n\n\n\n'
encipher_str = cipher.encrypt(pad_pwd)
print(encipher_str) # b'\xe1\xa8\x9e\xce\x83wSw\xed\xf5\xdb\xe4\xe6\xb7Z\x82'
# 解密
# 需要重新获取 cipher 对象
cipher = AES.new(key, AES.MODE_ECB)
decipher_str = cipher.decrypt(encipher_str)
print(decipher_str) # b'123456\n\n\n\n\n\n\n\n\n\n'
# unpad 逆填充函数
unpad_pwd = unpad(decipher_str, 16)
print(unpad_pwd) # b'123456'
2.CBC 模式
CBC 加密需要一个密钥 key 和一个偏移量 iv
- 测试
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
base_pwd = b"123456"
key = get_random_bytes(16)
iv = get_random_bytes(16)
# 加密
cipher = AES.new(key, AES.MODE_CBC, iv) # 须传入 iv
pad_pwd = pad(base_pwd, AES.block_size)
encipher_str = cipher.encrypt(pad_pwd)
# 解密
cipher = AES.new(key, AES.MODE_CBC, iv) # 须传入 iv
decipher_str = cipher.decrypt(encipher_str)
unpad_pwd = unpad(decipher_str, 16)
print(unpad_pwd) # b'123456'
三. RSA 加解密
公钥加密, 私钥解密
1. 加密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
base_pwd = b'123456'
# 生成私公钥
key = RSA.generate(1024) # 生成一个私钥对象, 长度必须 >= 1024
private_key = key.export_key() # 返回私钥
public_key = key.publickey().export_key() # 通过私钥生成公钥并返回
print(key) # Private RSA key at 0x2798D0E1A60
print(private_key)
'''
b'-----BEGIN RSA PRIVATE KEY-----
........ 省略
-----END RSA PRIVATE KEY-----'
'''
print(public_key)
'''
b'-----BEGIN PUBLIC KEY-----
......... 省略
-----END PUBLIC KEY-----'
'''
# 加密
pub_key = RSA.import_key(public_key) # 导入公钥返回公钥对象
print(pub_key) # Public RSA key at 0x15D7FE016D0
cipher = PKCS1_OAEP.new(pub_key) # 传入公钥对象生成 cipher 对象
encrypt_pwd = cipher.encrypt(base_pwd) # 传入密码得到加密后的密码
print(encrypt_pwd)
'''
b'\x15\xc9vF\xf9\xc5-=\x1d\xac\xc6\x1db\xfb\xb1\xf6\xf5{Q\xb9r... 省略 '
'''
2. 解密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
base_pwd = b'123456'
# 生成私公钥
key = RSA.generate(1024)
private_key = key.export_key()
public_key = key.publickey().export_key()
# 解密
pri_key = RSA.import_key(private_key) # 导入私钥返回私钥对象
cipher = PKCS1_OAEP.new(pri_key)
decrypt_pwd = cipher.decrypt(encrypt_pwd)
print(decrypt_pwd) # b'123456'
正文完