Python3 与 Java 进行 Rsa非对称加密详解------原创
第一次玩跨平台加密,做个笔记以防以后忘记。如果可以帮助到更多人,那是我的意愿。祝所有程序猿安康。资深2年程序猿。
言归正传
查阅资料,Rsa有很多种版本。crytpo是个很已经停止更新的版本了(上次发布: 2014年2月22日)
python官方 PyPI链接https://pypi.org/project/rsa/3.1.4/
但令人开心的是有个新的 加密库与crytpo的使用方法大致相同。
本次主要详细记录使用3天的经验只谈,本猿几乎踩到了全部的坑。可以在笔记中找到解决方案。
我可能有点啰嗦了哈。但是本猿是想将所有的经验"全部分享"开所以请谅解。
来了 他真的来了:
M2Crypto库中有很多中方法可以在使用 pycharm时找到:读取公/私钥也有不同所以遇到读取**的问题可以尝试换一个读取方法。填充方式也是有3中分别是(pkcs1_PADDING,pkcs1_oape_PADDING,ssLv23_PADDING)
在加载**时一定要注意 **文件的格式
读取公钥要使用 "-----BEGIN PUBLIC KEY-----\n" + public + "\n-----END PUBLIC KEY-----" 也可以直接写入文件内。
读取私钥也是类似"-----BEGIN PRIVATE KEY-----\n" + private + "\n-----END PRIVATE KEY-----"
小二我要点菜,给我来一道 rsa代码。
初始化导入 公钥私钥
考虑到加密的数据比较 len()比较长 所以需要分段加密。 如果保证加密对象绝对在 要求范围内可以选择不进行分段加密。
!!!!!!!!!!注意: 进行分段加密一定要与对接方 协同好 不然永远解不开
解密也是一样,一定要沟通好。
本猿遇到过很多种报错:再次分享一下 本猿大脑内存有限,只能想起这么多了。还有很多报错是很常见的 一定要检查代码
报错说明:
报错:读取私钥时报错信息是 not statr xxxx
读取私钥要将**用 "-----BEGIN PRIVATE KEY-----\n" + private + "\n-----END PRIVATE KEY-----"包裹。
报错:读取公钥时报错信息是 not statr xxxx
读取公钥要将**用 "-----BEGIN PUBLIC KEY-----\n" + public + "\n-----END PUBLIC KEY-----"包裹。
报错:Block type is not 01
要注意是否是 在base64.b64encode() 在传输的过程中 改变了 base格式字符串 如 + 变成 " " 一个空格
报错: M2Crypto.RSA.RSAError: pkcs decoding error
注意查看你读取的 **对是否正确
报错: 密码长度不正确
这是解密失败的原因检查沟通加密的方式.
上源码!!!! 等等。。啰嗦一句 : 希望可以帮助到 更多人。本猿是个热爱代码 热爱工作的人。 入门菜猿一只。勿喷勿喷。
class M2Crypt_Rutil():
def __init__(self,public=None,private=None):
if public is None or private is None :
raise '请输入初始化私钥或公钥'
if type(public) != str or type(private) !=str :
raise '请正确输入地址信息'
#读取公钥
with open(public, 'r') as f:
self.pubkey = f.read()
#读取私钥
with open(private, 'r') as f:
self.prikey = f.read()
# 公钥加密
def M2C_public_encrypt(self,decrypt_file):
decrypt_file = decrypt_file.encode('utf-8')
pub_bio = BIO.MemoryBuffer(self.pubkey.encode('utf-8')) # 公钥字符串
pub_rsa = RSA.load_pub_key_bio(pub_bio) # 加载公钥
length = len(decrypt_file)
default_length = 117
res = []
for i in range(0, length, default_length):
res.append(pub_rsa.public_encrypt(decrypt_file[i:i + default_length], RSA.pkcs1_padding)) # 分段加密
byte_data = b''.join(res)
# secret = pub_rsa.public_encrypt(decrypt_file, RSA.pkcs1_padding) # 公钥加密
sign = base64.b64encode(byte_data) # 密文base64编码
return sign
#私钥加密
def M2C_private_encrypt(self,decrypt_file):
decrypt_file = decrypt_file.encode('utf-8')
pub_bio = BIO.MemoryBuffer(self.prikey.encode('utf-8')) # 私钥字符串
pub_rsa = RSA.load_pub_key_bio(pub_bio) # 加载私钥
length = len(decrypt_file)
default_length = 117
res = []
for i in range(0, length, default_length):
res.append(pub_rsa.private_encrypt(decrypt_file[i:i + default_length], RSA.pkcs1_padding)) # 分段加密
byte_data = b''.join(res)
# secret = pub_rsa.public_encrypt(decrypt_file, RSA.pkcs1_padding) # 公钥加密
sign = base64.b64encode(byte_data) # 密文base64编码
return sign
# 公钥解密
def M2C_public_decrypt(self,decrypt_file):
b64_sign = decrypt_file # base64密文
cipher = base64.b64decode(b64_sign) # base64解码
pri_bio = BIO.MemoryBuffer(self.pubkey.encode('utf-8')) # 加载私钥
pri_rsa = RSA.load_pub_key_bio(pri_bio)
plain = pri_rsa.public_decrypt(cipher,RSA.pkcs1_padding) # 解密
return plain.decode('utf-8')
#私钥解密
def M2C_private_decrypt(self,decrypt_file):
b64_sign = decrypt_file # base64密文
cipher = base64.b64decode(b64_sign) # base64解码
pri_bio = BIO.MemoryBuffer(self.prikey.encode('utf-8')) # 加载私钥
pri_rsa = RSA.load_key_bio(pri_bio)
plain = pri_rsa.private_decrypt(cipher, RSA.pkcs1_padding) # 解密
return plain.decode('utf-8')
参考链接:https://segmentfault.com/a/1190000016851912
参考链接:https://github.com/xitu/gold-miner/blob/master/TODO/python-3-an-intro-to-encryption.md
参考链接:https://www.cnblogs.com/Colin-Cai/p/8013009.html
参考链接:https://blog.****.net/qq_38839677/article/details/80837589
参考链接:https://www.jb51.net/article/86022.htm