python tkinter 实现 带界面(GUI)的RSA加密、签名
参考文章:python tkinter 实现 带界面(GUI)的RSA加密、签名 - swuxyj - 博客园
RSA加密的过程是:使用公钥加密,私钥解密
RSA签名的过程是:使用私钥签名,公钥验证
所以核心代码就是,生成公钥私钥,使用公钥私钥分别进行加密解密。
在实际编码的时候,使用python自带的RSA库,需要特别处理编码问题,因为默认的加密解密函数是接收bytes类型的数据。
加密的核心代码如下:
# -*- coding: utf-8 -*-
import rsa
import base64
(public_key, private_key) = rsa.newkeys(1024)
msg = "M2Crypto python关于RSA的库还是蛮多的,当然也可以直接用openSSLqweasasd123"
msg = msg.encode(encoding="utf-8")
encrypt_msg = rsa.encrypt(msg, public_key)decrypt_msg = rsa.decrypt(encrypt_msg, private_key)
print("公钥:")
print(public_key.save_pkcs1().decode('utf8'))
print("\n私钥:")
print(private_key.save_pkcs1().decode('utf8'))
print("\n原始文本:")
print(msg.decode('utf8'))
print("\n加密后的文本:")
print(base64.encodebytes( encrypt_msg).decode('utf8'))
print("\n解密后的文本:")
print(decrypt_msg.decode('utf8'))
固定了一下密钥,封装了一下:
# -*- coding: utf-8 -*-
import rsa
import base64# 将公钥和私钥字符串写死到代码中
public_key_str = """-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAJlL2UCGa+vZZyCpilGRA5Oid6UO8yQQ5Jq7+AY4xCbsoRB8F4GgSPhI
w+imewOIwIZucYFSuxhAfA8bAPoXbi/1lgu8GSo2C/FptWooI5QsB2R1m1kv570Z
y8uCBiAtYA9axmok/16ijoxpWnk4oCsAHX1UwqUkPXmEOT26zA4nAgMBAAE=
-----END RSA PUBLIC KEY-----"""private_key_str = """-----BEGIN RSA PRIVATE KEY-----
MIICYgIBAAKBgQCZS9lAhmvr2WcgqYpRkQOTonelDvMkEOSau/gGOMQm7KEQfBeB
oEj4SMPopnsDiMCGbnGBUrsYQHwPGwD6F24v9ZYLvBkqNgvxabVqKCOULAdkdZtZ
L+e9GcvLggYgLWAPWsZqJP9eoo6MaVp5OKArAB19VMKlJD15hDk9uswOJwIDAQAB
AoGAAwR1MEn1Ed1jpEbyDAz4rw1BoaQbsRgMB+evSCAR7Fo4CWUH6WtIRGraQFgW
j8k/UOYXod4JBL8wMfPsG1xe3DAEw52odwL4hrHP45jGqNSc7jKDB+77o8+YpJLm
AF1LnMhM5fFbeZDKjUu1wurOWe6MNQRz28S96UIbULQGCpECRQC458I4Hqy92wFS
UuJAFLXBBC3q9v/bpoQq0YNB6b07rfhWOv3hX9dBXdATbfc8z779zoifh1/WWOnm
EhKE+OXoqauNJQI9ANQ8z85457xOHlonkMK1xOyf4Q6X6oJsMsxyXyN0P6lBu2Sx
J93xFgYfnjseivh6zAuBbrV5GuOkk/S6WwJFAKtQjvHP+dwtfRv5DwawKXWbma+J
CaVIsku5shLvrRQOK3g5T9/wHE/Dy3U0/UyqbhpZsNudYX4HAy7Wr7HjqZ/XE8rB
Aj0A0gkQejvK0d7ZSM0pBJhQNwAOAJw09zdOmmeBYZvUuJMVeZOcaZcB/bNiqw0R
6M/ViHlh73PXOXuQ9LtLAkUAtZ0O0ThbZgMfldcrpbKXryL4vaEEbtDwoBvl38Rg
qD4niX1X/TWp/FtKjFNNfR7ih3ufnAZE0xV6HFeTfGMCbPDN2Ik=
-----END RSA PRIVATE KEY-----"""# 从字符串加载密钥
public_key = rsa.PublicKey.load_pkcs1(public_key_str.encode('utf-8'))
private_key = rsa.PrivateKey.load_pkcs1(private_key_str.encode('utf-8'))def rsa_encrypt(message, public_key):"""使用公钥加密消息Args:message (str): 要加密的消息public_key (rsa.PublicKey): 公钥Returns:str: 基64编码的加密消息"""# 将消息编码为字节message_bytes = message.encode(encoding="utf-8")# 使用公钥加密消息encrypted_message = rsa.encrypt(message_bytes, public_key)# 将加密后的消息字节进行base64编码encrypted_message_b64 = base64.b64encode(encrypted_message).decode('utf-8')return encrypted_message_b64def rsa_decrypt(encrypted_message_b64, private_key):"""使用私钥解密消息Args:encrypted_message_b64 (str): 基64编码的加密消息private_key (rsa.PrivateKey): 私钥Returns:str: 解密后的消息"""# 将base64编码的加密消息解码为字节encrypted_message = base64.b64decode(encrypted_message_b64.encode('utf-8'))# 使用私钥解密消息decrypted_message_bytes = rsa.decrypt(encrypted_message, private_key)# 将解密后的消息字节解码为字符串decrypted_message = decrypted_message_bytes.decode('utf-8')return decrypted_message# 测试加密解密函数
msg = "M2Crypto python关于RSA的库还是蛮多的,当然也可以直接用openSSLqweasasd123"# 加密消息
encrypt_msg = rsa_encrypt(msg, public_key)
print("\n原始文本:")
print(msg)
print("\n加密后的文本:")
print(encrypt_msg)# 解密消息
decrypt_msg = rsa_decrypt(encrypt_msg, private_key)
print("\n解密后的文本:")
print(decrypt_msg)