python rsa签名_python3 RSA加密、解密、签名

#-*- coding: UTF-8 -*-#! /usr/bin/env python

importbase64from Crypto.Cipher importPKCS1_v1_5 as PKCS1_v1_5_cipperfrom Crypto.Signature importPKCS1_v1_5from Crypto.PublicKey importRSAfrom Crypto.Hash importSHAimportCrypto#-*- coding: UTF-8 -*-#! /usr/bin/env python

importbase64from Crypto.Cipher importPKCS1_v1_5 as PKCS1_v1_5_cipperfrom Crypto.Signature importPKCS1_v1_5from Crypto.PublicKey importRSAfrom Crypto.Hash importSHAimportCrypto#使用 rsa库进行RSA签名和加解密

classRsaUtil(object):

PUBLIC_KEY_PATH= 'D:\cloudpayDjango\conf\company_rsa_public_key.pem' #公钥

PRIVATE_KEY_PATH = 'D:\cloudpayDjango\conf\company_rsa_private_key.pem' #私钥

#初始化key

def __init__(self,

company_pub_file=PUBLIC_KEY_PATH,

company_pri_file=PRIVATE_KEY_PATH):ifcompany_pub_file:

self.company_public_key=RSA.importKey(open(company_pub_file).read())ifcompany_pri_file:

self.company_private_key=RSA.importKey(open(company_pri_file).read())def get_max_length(self, rsa_key, encrypt=True):"""加密内容过长时 需要分段加密 换算每一段的长度.

:param rsa_key: 钥匙.

:param encrypt: 是否是加密."""blocksize= Crypto.Util.number.size(rsa_key.n) / 8reserve_size= 11 #预留位为11

if not encrypt: #解密时不需要考虑预留位

reserve_size =0

maxlength= blocksize -reserve_sizereturnmaxlength#加密 支付方公钥

defencrypt_by_public_key(self, encrypt_message):"""使用公钥加密.

:param encrypt_message: 需要加密的内容.

加密之后需要对接过进行base64转码"""encrypt_result= b''max_length=int(self.get_max_length(self.company_public_key))

cipher=PKCS1_v1_5_cipper.new(self.company_public_key)whileencrypt_message:

input_data=encrypt_message[:max_length]

encrypt_message=encrypt_message[max_length:]

out_data= cipher.encrypt(input_data.encode(encoding='utf-8'))

encrypt_result+=out_data

encrypt_result=base64.b64encode(encrypt_result)returnencrypt_result#加密 支付方私钥

defencrypt_by_private_key(self, encrypt_message):"""使用私钥加密.

:param encrypt_message: 需要加密的内容.

加密之后需要对接过进行base64转码"""encrypt_result= b''max_length=int(self.get_max_length(self.company_private_key))

cipher=PKCS1_v1_5_cipper.new(self.company_public_key)whileencrypt_message:

input_data=encrypt_message[:max_length]

encrypt_message=encrypt_message[max_length:]

out_data= cipher.encrypt(input_data.encode(encoding='utf-8'))

encrypt_result+=out_data

encrypt_result=base64.b64encode(encrypt_result)returnencrypt_resultdefdecrypt_by_public_key(self, decrypt_message):"""使用公钥解密.

:param decrypt_message: 需要解密的内容.

解密之后的内容直接是字符串,不需要在进行转义"""decrypt_result= b""max_length=self.get_max_length(self.company_public_key, False)

decrypt_message=base64.b64decode(decrypt_message)

cipher=PKCS1_v1_5_cipper.new(self.company_public_key)whiledecrypt_message:

input_data=decrypt_message[:max_length]

decrypt_message=decrypt_message[max_length:]

out_data= cipher.decrypt(input_data.encode(encoding='utf-8'), '')

decrypt_result+=out_datareturndecrypt_resultdefdecrypt_by_private_key(self, decrypt_message):"""使用私钥解密.

:param decrypt_message: 需要解密的内容.

解密之后的内容直接是字符串,不需要在进行转义"""decrypt_result= b""max_length=int(self.get_max_length(self.company_private_key, False))

decrypt_message=base64.b64decode(decrypt_message)

cipher=PKCS1_v1_5_cipper.new(self.company_private_key)whiledecrypt_message:

input_data=decrypt_message[:max_length]

decrypt_message=decrypt_message[max_length:]

out_data= cipher.decrypt(input_data, '')

decrypt_result+=out_datareturndecrypt_result#签名 商户私钥 base64转码

defsign_by_private_key(self, message):"""私钥签名.

:param message: 需要签名的内容.

签名之后,需要转义后输出"""cipher= PKCS1_v1_5.new(self.company_private_key) #用公钥签名,会报错 raise TypeError("No private key") 如下

#if not self.has_private():

#raise TypeError("No private key")

hs =SHA.new(message)

signature=cipher.sign(hs)returnbase64.b64encode(signature)defverify_by_public_key(self, message, signature):"""公钥验签.

:param message: 验签的内容.

:param signature: 对验签内容签名的值(签名之后,会进行b64encode转码,所以验签前也需转码)."""signature=base64.b64decode(signature)

cipher=PKCS1_v1_5.new(self.company_public_key)

hs=SHA.new(message)#digest = hashlib.sha1(message).digest() # 内容摘要的生成方法有很多种,只要签名和解签用的是一样的就可以

returncipher.verify(hs, signature)

message= 'hellworldhellworldhellworldhell'

print("明文内容:>>>")print(message)

rsaUtil=RsaUtil()

encrypy_result=rsaUtil.encrypt_by_public_key(message)print("加密结果:>>>")print(encrypy_result)

decrypt_result=rsaUtil.decrypt_by_private_key(encrypy_result)print("解密结果:>>>")print(decrypt_result)

sign= rsaUtil.sign_by_private_key(bytearray(message.encode(encoding='utf-8')))print("签名结果:>>>")print(sign)print("验签结果:>>>")print(rsaUtil.verify_by_public_key(bytearray(message.encode(encoding='utf-8')), sign))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值