视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
M2CryptoRSA加密、解密的实例介绍
2020-11-27 14:14:01 责编:小采
文档

M2Crypto 模块

快速安装:

# 环境centos7.0,提前装好openssl(自行百度安装),windows装不上,暂不考虑了

[root@localhost ~]# pip install m2crypto

# 验证
>>> import M2Crypto
>>>

先做准备工作:

# centos系统上执行以下命令生成公钥和私钥

[root@localhost ~]# openssl genrsa -out key.pem 1024
[root@localhost ~]# openssl rsa -in key.pem -pubout -out pubkey.pem
-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQDhhyVxmY/TU/buuIfwlykV1d5Wg5PRu4Qu14LssRhZH9E9pVbX
lGeP1Q8iJEErHt4Rk5tsFgavDf+L5QIM8zpmydJqbivUJCY/5b9zSwVSnDhFfGaj
LY4Bj7Fq0yngRkxwUVaTmJ/u0FiKzy1mpnk0Xmj/pk7AburWj3YHVsYtuwIDAQAB
AoGATYKhP9XDNKJa79jD/9Az8qk6bQlzuFV2LJMtECQddiQVSdaVbio3HZvgQ5+q
NiO5ttjARfmb+nYZKf9fIQxHOX9GJeepzkvltZJO0LheS0+ZsX2ab62cv8ThUndf
yp/thuqHHXt7ERYIHS7CzvzPUQ303OEA9a6WLDaTL/MpjEECQQD5G5cJrEAL1rGF
0ELSRl0YRRRyywmGmc0Wlx0VHCyqG0/5GgmPJmB+8t7k7CtTgRhzStYSmwExzioh
ylL3vpgTAkEA58SKxKezIGcuFbCB54yuWEtgauYNrBYauQLC7+Z9d6NjFUrcHO00
1cVJ0cvIK++hvvOrCIUpq/86N8JFUyWYuQJACnH5t1IdrWFnODEvXBnPNYFQBjA1
SguQ6e2ULppr1QYoKE3LMNFvImOUrQyqFGpJWCw/JbCSMEBwy9HsAK9hOQJAIV6v
DDmJFPVGMWFEku4yfAv+SeXtugVEu7amEpyBHCSuM3af0ppkrRLG2ioZHBpYk4HJ
8mQZ5+XLoBOcn6geIQJBAIcFTwZETKFs1h6dov3Bp6EPq8zZBABvy7fhCsQk9uX6
6lI0pty9E3KUWGTw4AVp3EwGTc7OqLfiZQTgV65eBcA=
-----END RSA PRIVATE KEY-----
key.pem
-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDhhyVxmY/TU/buuIfwlykV1d5W
g5PRu4Qu14LssRhZH9E9pVbXlGeP1Q8iJEErHt4Rk5tsFgavDf+L5QIM8zpmydJq
bivUJCY/5b9zSwVSnDhFfGajLY4Bj7Fq0yngRkxwUVaTmJ/u0FiKzy1mpnk0Xmj/pk7AburWj3YHVsYtuwIDAQAB-----END PUBLIC KEY-----
pubkey.pem

如何使用

1、私钥加密:

import M2Crypto
import json

# 私钥加密
def pri_encrypt(msg, file_name):
 rsa_pri = M2Crypto.RSA.load_key(file_name) # 导入秘钥 <M2Crypto.RSA.RSA instance at 0x24da8c0>
 ctxt_pri = rsa_pri.private_encrypt(msg, M2Crypto.RSA.pkcs1_padding) # 这里的方法选择加密填充方式,所以在解密的时候 要对应。
 print(ctxt_pri,type(ctxt_pri))
 ctxt_pri = ctxt_pri.encode('base') # 密文是base 只能写base 方便保存 encode成str
 print ('密文:%s'% ctxt_pri,type(ctxt_pri))
 return ctxt_pri

prikey_file = 'key.pem'
data = {'name':'Jefrey'}
message = json.dumps(data)

pri_encrypt(message,prikey_file)

# 打印
# ("x8exc8 x98xeaxd5%&xe3xfaxa5xbbu];zZxf0xc1xddxf3x8fxaaxdcxfaxbcxacgxfdx0b3xbbax94Kx91taxda
# xdfxd05xecVxb1xffxf0xc4x07xbfx1cxe0xfcx84&xfcpxf5\xabxd8xf2#xfcxce:]xbae]W47xf7xc9x9aXtxff
# xe9xdax19x82xecDPxb2xcbxd3x8d@x81F'x9f}xfbx8bxb1o>x91xf0Gxc36x19Qxf8x7fxafxbexa2xeexf0Vx88
# xbd[x1e3xafxf0xd3xebuxa9", <type 'str'>)
# ('xe5xafx86xe6x96x87:jsggmOrVJSbj+qW7dV07elrwwd3zj6rc+rysZ/0LM7thlEuRdGHaIN/QNexWsf/wxAe/HOD8hCb8
cPVcq9jyI/zO
# Ol26ZV1XNDf3yZpYdP/p2hmC7ERQssvTjUCBRiefffuLsW8+kfBHwzYZUfh/r76i
7vBWiL1bHjOv8NPrdak=
', <type 'str'>)

2、公钥解密(文件路径):

import M2Crypto
import json

# 私钥加密
def pri_encrypt(msg, file_name):
 rsa_pri = M2Crypto.RSA.load_key(file_name) # 导入秘钥
 ctxt_pri = rsa_pri.private_encrypt(msg, M2Crypto.RSA.pkcs1_padding) # 进行加密 pkcs1_padding加密填充方式,解密的时候要对应。
 ctxt_pri = ctxt_pri.encode('base') # 密文是base 只能写base 方便保存 encode成str
 print ('密文:%s'% ctxt_pri,type(ctxt_pri))
 return ctxt_pri

# 公钥解密传入文件路径
def pub_decrypt(msg, file_name):
 rsa_pub = M2Crypto.RSA.load_pub_key(file_name)
 ctxt_pri = msg.decode("base") # 先将str转成base
 maxlength = 128 # 128位
 output = ''
 while ctxt_pri:
 input = ctxt_pri[:128]
 ctxt_pri = ctxt_pri[128:]
 out = rsa_pub.public_decrypt(input, M2Crypto.RSA.pkcs1_padding) #解密
 output = output + out
 print('明文:%s'% output,type(output))
 print('Json:%s'% json.loads(output),type(json.loads(output)))

prikey_file = 'key.pem'
pubkey_file = 'pubkey.pem'
data = {'name':'Jefrey'}
message = json.dumps(data)

primsg = pri_encrypt(message,prikey_file)
pub_decrypt(primsg,pubkey_file)

# 打印
# ('xe6x98x8exe6x96x87:{"name": "Jefrey"}', <type 'str'>)
# ("Json:{u'name': u'Jefrey'}", <type 'dict'>)

3、公钥解密(字符串):

import M2Crypto
import json

# 私钥加密
def pri_encrypt(msg, file_name):
 rsa_pri = M2Crypto.RSA.load_key(file_name) # 导入秘钥
 ctxt_pri = rsa_pri.private_encrypt(msg, M2Crypto.RSA.pkcs1_padding) # 进行加密 pkcs1_padding加密填充方式,解密的时候要对应。
 ctxt_pri = ctxt_pri.encode('base') # 密文是base 只能写base 方便保存 encode成str
 # print ('密文:%s'% ctxt_pri,type(ctxt_pri))
 return ctxt_pri

# 公钥解密传入字符串
def pub_decrypt(msg, pub_key):
 bio = M2Crypto.BIO.MemoryBuffer(pub_key)
 rsa_pub = M2Crypto.RSA.load_pub_key_bio(bio)
 ctxt_pri = msg.decode("base") # 先将str转成base
 output = rsa_pub.public_decrypt(ctxt_pri, M2Crypto.RSA.pkcs1_padding) #解密
 print('明文:%s'% output,type(output))
 print('Json:%s'% json.loads(output),type(json.loads(output)))

prikey_file = 'key.pem'
pubkey_file = 'pubkey.pem'
data = {'name':'Jefrey'}
message = json.dumps(data)

primsg = pri_encrypt(message,prikey_file)
with open(pubkey_file,'r+') as f:
 pub_key = f.read()
pub_decrypt(primsg,pub_key)

# 打印
# ('xe6x98x8exe6x96x87:{"name": "Jefrey"}', <type 'str'>)
# ("Json:{u'name': u'Jefrey'}", <type 'dict'>)

小结:上面写的是私钥加密,公钥解密;反过来也一样,public_encrypt公钥加密,private_decrypt私钥解密;

下载本文
显示全文
专题