Crypto模块对称加密&公钥加密

262次阅读
没有评论

共计 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'
正文完
 1
shawn
版权声明:本站原创文章,由 shawn 2023-06-12发表,共计2766字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)