from Crypto import Random from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5 import base64 def create_key(): # 伪随机数生成器 random_generator = Random.new().read # rsa算法生成实例 """ 加密时支持的最大字节数与证书有一定关系。 加密时支持的最大字节数:证书位数/8 -11(比如:2048位的证书,支持的最大加密字节数:2048/8 - 11 = 245) 1024位的证书,加密时最大支持117个字节,解密时为128; 2048位的证书,加密时最大支持245个字节,解密时为256。 """ rsa = RSA.generate(1024, random_generator) # rsa = RSA.generate(2048, random_generator) # 私钥的生成 private_pem = rsa.exportKey() with open("private.pem", "wb") as f: f.write(private_pem) # 公钥的生成 public_pem = rsa.publickey().exportKey() with open("public.pem", "wb") as f: f.write(public_pem) def add_to_245(text): if len(text.encode('utf-8')) % 245: add = 245 - (len(text.encode('utf-8')) % 245) else: add = 0 text = text + ('\0' * add) return text.encode('utf-8') def encrypt(text): # 加密 with open('public.pem', 'r', encoding='utf-8') as r: key = r.read() print('加密key长度:{}'.format(len(key))) rsakey = RSA.importKey(key) cipher = Cipher_pkcs1_v1_5.new(rsakey) # 创建用于执行pkcs1_v1_5加密或解密的密码 cipher_text = base64.b64encode(cipher.encrypt(text.encode('utf-8'))) t = cipher_text.decode('utf-8') return t # 解密后,去掉补足的空格用strip() 去掉 def decrypt(text): text = text.encode('utf-8') with open('private.pem', 'r', encoding='utf-8') as r: key = r.read() print('解密key长度:{}'.format(len(key))) rsakey = RSA.importKey(key) cipher = Cipher_pkcs1_v1_5.new(rsakey) # 创建用于执行pkcs1_v1_5加密或解密的密码 text = cipher.decrypt(base64.b64decode(text), "解密失败") print(text.decode('utf-8')) if __name__ == '__main__': create_key() s = '1qaz@WSX' e = encrypt(s) # 加密 print(e) print(len(e)) decrypt(e)