python-pycrypto模块浅学

python-pycrypto模块学习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> pycrypto模块时python中来处理加密解密等信息安全相关的一个重要模块
> 对称加密方式:
>
> AES
> DES
> ARC4
> 散列值计算:
>
> MD5
> SHA
> HMAC
> 公钥加密和签名:
>
> RSA
> DSA
>

生成公私密钥

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
#伪随机数生成器
random_generator = Random.new().read
#rsa算法生成实例
rsa = RSA.generate(1024,random_generator)
#master的密钥对的生成
private_pem = rsa.exportKey()

#生成公私钥对文件
with open('master-private.pem','wb') as f:
f.write(private_pem)

public_pem = rsa.publickey().exportKey()
with open('master-public.pem','wb') as f:
f.write(public_pem)

"""
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXamjBCTqlzBxnk0B00G/Ae6hk
pKS/0zz0Q7qvCGOjWttrmPyvDdMgxyGnJri4PHvMkN0jAMbU32NKN8ojcoKOdH43
4DPL/ClbqMi5usk70HLDpfhWs/ylOJ6H01JyIzONnZsr3MdOde8RNvn2ZGjk3JqX
DfOzB3T0Ad0F3p7OBwIDAQAB
-----END PUBLIC KEY-----

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDXamjBCTqlzBxnk0B00G/Ae6hkpKS/0zz0Q7qvCGOjWttrmPyv
DdMgxyGnJri4PHvMkN0jAMbU32NKN8ojcoKOdH434DPL/ClbqMi5usk70HLDpfhW
s/ylOJ6H01JyIzONnZsr3MdOde8RNvn2ZGjk3JqXDfOzB3T0Ad0F3p7OBwIDAQAB
AoGAeVSc9gUtvE7PvOLqjiEMoJzFxxIZHVZsYaR4VLfj7xFwvxTnVe3yeebPJKeh
qVuf2yPI+jsowqOj+ByeRQLtVyjoZH7aW6uZQcKUtMrAMgcZouIKpKVWFhjWguFl
CExsfi8EqzxVsBPBkHynqkU69IB4yPB1AMRb4ZcGsYvCgNECQQDpBoiaMD72+YOb
bnXKhqW8PxU6/ylZvZL+wFE4Qwcu0nclni/vMMkrxK8oZvAiVOqBjCSXwcA6zZXL
MZppBJaZAkEA7Kdo+7fCUyAeivzoYGHKE8Kmr/RTHW7oSgz1bBMdzAugsO8zuNGA
fMnLYXTGBJFlfPQuOW3W6Q5UKHppV0uNnwJBAL0kU36ryH/ZGWzxJOUFk8MPhSEE
+cBgss7atVIwfcUQiitbkdbZR4CiPfZST3neaRZL9WvElU5ljr+GfKnfUokCQA5L
wqzKGgQZgZ7VzlfcMG/nJ1ijws2ZYJDwnXbM5NTpsuhdWtuEVGW1bwLRIhEuk1ns
CkrP1ta3VeAoHOr4FnMCQDxnFKPCpjRSEM96xFDNgNh+66wgKg/SXMY5E7e0/LvB
oFcJauclu+cP8eaqP0zasVR/xqQT4y091vSZzIADJLA=
-----END RSA PRIVATE KEY-----
"""

利用python对RSA根据公私钥加解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#RSA使用公私钥加解密数据:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_phcs_v1_5
import base64

message = 'hello demos this is a plian text!'
with open('./master-public.pem','r') as f:
key = f.read()
rsakey = RSA.importKey(key) #导入读取到的公钥
cipher = Cipher_phcs_v1_5.new(rsakey) #实例化
cipher_text = base64.b64encode(cipher.encrypt(message)) #这里需要注意的一点是,py2可以直接将str加密,而py3要转换为bytes
# cipher_text = base64.b64encode(cipher.encrypt(message).encode(encoding = 'utf-8')) #语句如下
print cipher_text

with open('./master-private.pem','r') as f:
key = f.read()
rsakey = RSA.importKey(key)
cipher = Cipher_phcs_v1_5.new(rsakey)
text = cipher.decrypt(base64.b64decode(cipher_text),"ERROR")
print text #py2这里返回的是str类型的,py3返回的是bytes,需要自己转换

总结

在python中libnum、gmpy2、pycrypto在密码学中的应用广泛,也特别方便。