# -*- coding:utf-8 -*-
#############################
# pip install pycryptodome
#############################
import base64
from Crypto import Random
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
# 1. 伪随机生成器
random_generator = Random.new().read
print(random_generator)
# 2. rsa实例
rsa = RSA.generate(1024, random_generator)
# 3. 生成私钥 公钥
private_key = rsa.export_key()
public_key = rsa.publickey().export_key()
print(private_key)
print(public_key)
# 4. 秘钥写入文件
with open('private_key.pem', 'wb') as f:
f.write(private_key)
with open('public_key.pem', 'wb') as f:
f.write(public_key)
# 5. 公钥加密
with open('public_key.pem', 'rb') as f:
public_key = f.read()
rsa_key = RSA.import_key(public_key)
pkcs = Cipher_pkcs1_v1_5.new(rsa_key)
text = base64.b64encode(pkcs.encrypt('1234'.encode(encoding='utf-8')))
print(text)
# 6. 私钥解密
with open('private_key.pem', 'rb') as f:
private_key = f.read()
rsa_key = RSA.import_key(private_key)
pkcs = Cipher_pkcs1_v1_5.new(rsa_key)
text = pkcs.decrypt(base64.b64decode(text), random_generator).decode()
print(text)
# 7. 签名和验签
# 7.1 私钥签名
print('私钥签名')
with open('private_key.pem') as f:
key = f.read()
rsa_key = RSA.importKey(key)
signer = Signature_pkcs1_v1_5.new(rsa_key)
digest = SHA.new()
digest.update('签名和验签'.encode("utf8"))
sign = signer.sign(digest)
signature = base64.b64encode(sign)
print(signature)
# 7.2 公钥验签
print('公钥验签')
with open('public_key.pem') as f:
key = f.read()
rsa_key = RSA.importKey(key)
verifier = Signature_pkcs1_v1_5.new(rsa_key)
digest = SHA.new()
digest.update('签名和验签'.encode("utf8"))
is_verify = verifier.verify(digest, base64.b64decode(signature))
print(is_verify)