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

python RSA加密、解密、签名

python中用于RSA加解密的库有好久个,本文主要讲解rsa、M2Crypto、Crypto这三个库对于RSA加密、解密、签名、验签的知识点。

知识基础

加密是为了保证传输内容隐私,签名是为了保证消息真实性。

服务器存私钥,客户端存公钥。(服务器和客户端关系可以考虑为 1:N)

客户端往服务器传输内容,更多考虑是隐私性,所以公钥签名、私钥解密。

服务器往客户端传输内容,更多考虑真实性,所以私钥签名,公钥验签。

消息的摘要生的算法常用的是MD5或者SHA1,消息内容不一样,生成的摘要信息一定不一样。

真实性的考虑一方面是内容由私钥拥有者发出,另一方面内容在传输过程中没有改变过,所以签名的对象是传输信息生成的消息摘要(摘要内容短,签名也会快些)。

每次加密的长度需要小于密钥长度-特殊位(128位公钥,最长可加密128-11=117位明文)。

每次解密的长度需要小于密钥的长度(128位私钥解密,解密密文长度需要小于等于128位)。

如果加解密内容过长,就需要分段加密、解密。

PEM格式的密钥为base64位文本格式。

环境配置

环境:MAC

python版本:2.7.15(因为公司用的版本都是这个,建议用python3的)

IED:PyCharm

密钥:PEM文件

rsa

示例代码

# -*- coding: UTF-8 -*-

# ! /usr/bin/env python

import base64

import rsa

from rsa import common

# 使用 rsa库进行RSA签名和加解密

class RsaUtil(object):

PUBLIC_KEY_PATH = '/Users/anonyper/Desktop/key/company_rsa_public_key.pem' # 公钥

PRIVATE_KEY_PATH = '/Users/anonyper/Desktop/key/company_rsa_private_key.pem' # 私钥

# 初始化key

def __init__(self,

company_pub_file=PUBLIC_KEY_PATH,

company_pri_file=PRIVATE_KEY_PATH):

if company_pub_file:

self.company_public_key = rsa.PublicKey.load_pkcs1_openssl_pem(open(company_pub_file).read())

if company_pri_file:

self.company_private_key = rsa.PrivateKey.load_pkcs1(open(company_pri_file).read())

def get_max_length(self, rsa_key, encrypt=True):

"""加密内容过长时 需要分段加密 换算每一段的长度.

:param rsa_key: 钥匙.

:param encrypt: 是否是加密.

"""

blocksize = common.byte_size(rsa_key.n)

reserve_size = 11 # 预留位为11

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

reserve_size = 0

maxlength = blocksize - reserve_size

return maxlength

# 加密 支付方公钥

def encrypt_by_public_key(self, message):

"""使用公钥加密.

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

加密之后需要对接过进行base64转码

"""

encrypt_result = b''

max_length = self.get_max_length(self.company_public_key)

while message:

input = message[:max_length]

message = message[max_length:]

out = rsa.encrypt(input, self.company_public_key)

encrypt_result += out

encrypt_result = base64.b64encode(encrypt_result)

return encrypt_result

def decrypt_by_private_key(self, message):

"""使用私钥解密.

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

解密之后的内容直接是字符串,不需要在进行转义

"""

decrypt_result = b""

max_length = self.get_max_length(self.company_private_key, False)

decrypt_message = base64.b64decode(message)

while decrypt_message:

input = decrypt_message[:max_length]

decrypt_message = decrypt_message[max_length:]

out = rsa.decrypt(input, self.company_private_key)

decrypt_result += out

return decrypt_result

# 签名 商户私钥 base64转码

def sign_by_private_key(self, data):

"""私钥签名.

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

使用SHA-1 方法进行签名(也可以使用MD5)

签名之后,需要转义后输出

"""

signature = rsa.sign(str(data), priv_key=self.company_private_key, hash='SHA-1')

return base64.b64encode(signature)

def verify_by_public_key(self, message, signature):

"""公钥验签.

:param message: 验签的内容.

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

"""

signature = base64.b64decode(signature)

return rsa.verify(message, signature, self.company_public_key)

message = 'hell world'

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(message)

print("签名结果:>>> ")

print(sign)

print("验签结果ÿ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值