前言
- 加密技术在数据安全存储,数据传输中发挥着重要作用,能够保护用户隐私数据安全,防止信息窃取。RSA是一种非对称加密技术,在软件、网页中已得到广泛应用。本文将介绍RSA加密解密在python中的实现。
- 原则:公钥加密,私钥解密
- 解释:具体过程的解释请见代码前的注释
如果本文对您有帮助,不妨点赞、收藏、关注哟!您的支持和关注是博主创作的动力!
一、安装模块
1
|
pip install pycryptodome |
二、生成密钥对
- 密钥对文件生成和读取
- 代码:
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
|
from Crypto.PublicKey import RSA def create_rsa_pair(is_save = False ): ''' 创建rsa公钥私钥对 :param is_save: default:False :return: public_key, private_key ''' f = RSA.generate( 2048 ) private_key = f.exportKey( "PEM" ) # 生成私钥 public_key = f.publickey().exportKey() # 生成公钥 if is_save: with open ( "crypto_private_key.pem" , "wb" ) as f: f.write(private_key) with open ( "crypto_public_key.pem" , "wb" ) as f: f.write(public_key) return public_key, private_key def read_public_key(file_path = "crypto_public_key.pem" ) - > bytes: with open (file_path, "rb" ) as x: b = x.read() return b def read_private_key(file_path = "crypto_private_key.pem" ) - > bytes: with open (file_path, "rb" ) as x: b = x.read() return b |
三、加密
- 流程:输入文本(str)→字符串编码(默认utf-8)(bytes)→rsa加密(bytes)→base64编码(bytes)→解码为字符串(str)
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import base64 from Crypto.Cipher import PKCS1_v1_5 from Crypto.PublicKey import RSA def encryption(text: str , public_key: bytes): # 字符串指定编码(转为bytes) text = text.encode( 'utf-8' ) # 构建公钥对象 cipher_public = PKCS1_v1_5.new(RSA.importKey(public_key)) # 加密(bytes) text_encrypted = cipher_public.encrypt(text) # base64编码,并转为字符串 text_encrypted_base64 = base64.b64encode(text_encrypted ).decode() return text_encrypted_base64 if __name__ = = '__main__' : public_key = read_public_key() text = '123456' text_encrypted_base64 = encryption(text, public_key) print ( '密文:' ,text_encrypted_base64) |
四、解密
- 说明:解密流程与加密流程相反(按照加密流程逆序解密)
- 流程:输入文本(str)→字符串编码(默认utf-8)(bytes)→base64解码(bytes)→rsa解密(bytes)→解码为字符串(str)
- 代码:
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
|
import base64 from Crypto.Cipher import PKCS1_v1_5 from Crypto import Random from Crypto.PublicKey import RSA def decryption(text_encrypted_base64: str , private_key: bytes): # 字符串指定编码(转为bytes) text_encrypted_base64 = text_encrypted_base64.encode( 'utf-8' ) # base64解码 text_encrypted = base64.b64decode(text_encrypted_base64 ) # 构建私钥对象 cipher_private = PKCS1_v1_5.new(RSA.importKey(private_key)) # 解密(bytes) text_decrypted = cipher_private.decrypt(text_encrypted , Random.new().read) # 解码为字符串 text_decrypted = text_decrypted.decode() return text_decrypted if __name__ = = '__main__' : # 生成密文 public_key = read_public_key() text = '123456' text_encrypted_base64 = encryption(text, public_key) print ( '密文:' ,text_encrypted_base64) # 解密 private_key = read_private_key() text_decrypted = decryption(text_encrypted_base64, private_key) print ( '明文:' ,text_decrypted) |
五、完整代码
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
|
import base64 from Crypto.Cipher import PKCS1_v1_5 from Crypto import Random from Crypto.PublicKey import RSA # ------------------------生成密钥对------------------------ def create_rsa_pair(is_save = False ): ''' 创建rsa公钥私钥对 :param is_save: default:False :return: public_key, private_key ''' f = RSA.generate( 2048 ) private_key = f.exportKey( "PEM" ) # 生成私钥 public_key = f.publickey().exportKey() # 生成公钥 if is_save: with open ( "crypto_private_key.pem" , "wb" ) as f: f.write(private_key) with open ( "crypto_public_key.pem" , "wb" ) as f: f.write(public_key) return public_key, private_key def read_public_key(file_path = "crypto_public_key.pem" ) - > bytes: with open (file_path, "rb" ) as x: b = x.read() return b def read_private_key(file_path = "crypto_private_key.pem" ) - > bytes: with open (file_path, "rb" ) as x: b = x.read() return b # ------------------------加密------------------------ def encryption(text: str , public_key: bytes): # 字符串指定编码(转为bytes) text = text.encode( 'utf-8' ) # 构建公钥对象 cipher_public = PKCS1_v1_5.new(RSA.importKey(public_key)) # 加密(bytes) text_encrypted = cipher_public.encrypt(text) # base64编码,并转为字符串 text_encrypted_base64 = base64.b64encode(text_encrypted).decode() return text_encrypted_base64 # ------------------------解密------------------------ def decryption(text_encrypted_base64: str , private_key: bytes): # 字符串指定编码(转为bytes) text_encrypted_base64 = text_encrypted_base64.encode( 'utf-8' ) # base64解码 text_encrypted = base64.b64decode(text_encrypted_base64) # 构建私钥对象 cipher_private = PKCS1_v1_5.new(RSA.importKey(private_key)) # 解密(bytes) text_decrypted = cipher_private.decrypt(text_encrypted, Random.new().read) # 解码为字符串 text_decrypted = text_decrypted.decode() return text_decrypted if __name__ = = '__main__' : # 生成密钥对 # create_rsa_pair(is_save=True) # public_key = read_public_key() # private_key = read_private_key() public_key, private_key = create_rsa_pair(is_save = False ) # 加密 text = '123456' text_encrypted_base64 = encryption(text, public_key) print ( '密文:' , text_encrypted_base64) # 解密 text_decrypted = decryption(text_encrypted_base64, private_key) print ( '明文:' , text_decrypted) |
运行:
到此这篇关于Python实现RSA加密解密的文章就介绍到这了,更多相关Python RSA加解密内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://juejin.cn/post/7083429856330907685