【模块】:RSA加密、解密

摘要:
M2Crypto模块快速安装:#环境centos7.0,提前装好openssl(自行百度安装),windows装不上,暂不考虑了[root@localhost~]#pipinstallm2crypto#验证˃˃˃importM2Crypto˃˃˃先做准备工作:#centos系统上执行以下命令生成公钥和私钥[root@localhost~]#opensslgenrsa-outkey.pem1024[

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
【模块】:RSA加密、解密第1张【模块】:RSA加密、解密第2张
-----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
【模块】:RSA加密、解密第1张【模块】:RSA加密、解密第4张
-----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))
    ctxt64_pri = ctxt_pri.encode('base64')  # 密文是base64 只能写base64  方便保存 encode成str
    print ('密文:%s'% ctxt64_pri,type(ctxt64_pri))
    return ctxt64_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加密填充方式,解密的时候要对应。
    ctxt64_pri = ctxt_pri.encode('base64')        # 密文是base64 只能写base64  方便保存 encode成str
    print ('密文:%s'% ctxt64_pri,type(ctxt64_pri))
    return ctxt64_pri
# 公钥解密传入文件路径
def pub_decrypt(msg, file_name):
    rsa_pub = M2Crypto.RSA.load_pub_key(file_name)
    ctxt_pri = msg.decode("base64")     # 先将str转成base64
    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加密填充方式,解密的时候要对应。
    ctxt64_pri = ctxt_pri.encode('base64')        # 密文是base64 只能写base64  方便保存 encode成str
    # print ('密文:%s'% ctxt64_pri,type(ctxt64_pri))
    return ctxt64_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("base64")     # 先将str转成base64
    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私钥解密

免责声明:文章转载自《【模块】:RSA加密、解密》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇服务器渲染和浏览器渲染的区别Java静态内存与动态内存分配的解析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

javascript 使用数据加密跟base64 编码

下面的js代码首先将给定的数据字符串,跟指定的密匙字符串做异或运算,接着将结果序列进行base64编码,下面同时给出了解密算法跟,base64还原函数 代码如下: function secode(opArray) {var _local2 = opArray;var strEnd="=";var _local3 = "ABCDEFGHIJKLMNOPQR...

python -第七节课之加密操作之md5加密和base64类型

常用的加密方式就是md5加密 实际场景:用户管理数据存到数据库,注册的时候账号和密码不能存成铭文要转成加密的形式 python使用的模块hashlib 举例子 import hashlibs='cdsdsa's=s.encode()#字符串转成bytes类型m=hashlib.md5(s)#md5方法必须传一个bytes类型res=m.hexdigest(...

Qt Base64 编解码工具

需求:两台主机之间只能通过剪贴板文本通信,要求将主机A的文件拷贝到主机B(具体场景嘛,懂的都懂)。对于NotePad++等文本编辑器,打开较大的文件进行Base64 encode/decode 容易崩溃失败,于是想写个工具,在主机A从文本Base64 encode到剪贴板,在主机B直接从剪贴板Base64 decode还原出原始的文件,从而实现文件拷贝 D...

处理 json数据,base64合成图片

Main.java package cleandata; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.concurrent.LinkedBlockingQueue; public class Main {...

java script btoa与atob的

javascript原生的api本来就支持,Base64,但是由于之前的javascript局限性,导致Base64基本中看不中用。当前html5标准正式化之际,Base64将有较大的转型空间,对于Html5 Api中出现的如FileReader Api, 拖拽上传,甚至是Canvas,Video截图都可以实现。 好了,前言说了一大堆,Base64转码和解...

openssl3.0 加密算法库编程精要 05 详解 EVP API 公开密钥密码算法 生成密钥对

5.1 公开密钥系统简介   公开密钥系统最早于上世纪 70 年代被发明。在这种密码系统中,已知加密密钥,在现有计算机技术条件下很难快速 求出解密密钥,这个推导过程耗费的计算机算力巨大到不切实际,所以加密密钥是可以公开的,所以这种系统被称为公 开密钥系统。公开密钥系统被广泛地用于各种密码协议、数字签名以及电子商务等各种领域中。 5.2 RSA 算法   公...