python RSA加密、解密、签名

本文介绍了Python中rsa、M2Crypto、Crypto三个库用于RSA加密、解密、签名和验签的使用方法,包括知识基础、环境配置、各库的关键代码示例及注意事项。内容涵盖密钥长度计算、加密解密限制、签名验签的实现等,强调了公钥和私钥在加解密与签名验签中的角色。同时,提到了在实际应用中可能出现的特殊字符转义问题及其解决方案。
摘要由CSDN通过智能技术生成

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

示例代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

# -*- 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(inputself.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(inputself.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(

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青年夏日科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值