python写接口自动化需要rsa加密_Python实现RSA无填充加密,兼容BouncyCastle

本文介绍了如何在Python中实现RSA无填充加密,以匹配JavaScript的加密结果。通过使用特定的算法,避免了常规库中因填充导致的加密结果不一致问题。文中还提供了从公钥参数生成PEM格式公钥的代码示例。
摘要由CSDN通过智能技术生成

场景

某系统登录时密码经过前台rsa加密传给后端,为实现模拟登录需要原样生成加密串。

分析

前台通过RSA.js、BigInt.js、Barrett.js三个js文件实现加密,公钥通过ajax请求获得empoent、module。

rsa算法其实就是通过这两个参数计算实现公钥加密,所以正常情况下使用常规加密库即可达到目的。

但实际测试发现使用cryptography、pycryptodem等库加密结果与js输出不一致且每次都不同。其实常规库会按一定规则对原文随机填充后再加密,这样可保证相当的安全性。

于是考虑如何用python实现无填充的加密。

代码

经过搜索发现了相当简单(不安全)的实现方式,代码如下:

if __name__ == '__main__':#实为16进制串,前补0

e = '010001'

#m也需要补00

m = '008eb933413be3234dddd2730fbb1d05c8848a43d5dc3bdd997f2a9935fba6beb9ffb36854482b0b46cf7e6f9afbbe2e2e7d606fde20bec57dbf722e7985192e8813e6b67628a6f202cf655b7d2ffce4e9dc682dd6034ae706c8e255f25e4051b9ca43f25b3ad686aac9c8f6aeb71d921c13a255c806f78a5a7b9a356c2dd274e3'm= int.from_bytes(bytearray.fromhex(m), byteorder='big')

e= int.from_bytes(bytearray.fromhex(e), byteorder='big')#js加密为反向,为保持一致原文应反向处理,所以这里原文实际为204dowls

plaintext = 'slwod402'.encode('utf-8')#无填充加密逻辑

input_nr = int.from_bytes(plaintext, byteorder='big')

crypted_nr=pow(input_nr, e, m)

keylength= math.ceil(m.bit_length() / 8)

crypted_data= crypted_nr.to_bytes(keylength, byteorder='big')print(crypted_data.hex())#72ff82c8f227ba9cf429635b89291b2d7ef54bcf8635af432b9917bd3593d8d8aa0c186764cef86c8530d349db6132521a9c70af939a0242bb3d01ce7094cf91f3a058742fc680d70b17c4441ebf60fd4f92bce660e4785fe56d85ac7f7023f4ccf702c247f37b36a255dc04d9ce14745f422c6113290ff9b479494fd805557e

另附上从empoent、module生成公钥方法,需要的朋友可以参考:

from cryptography.hazmat.backends importdefault_backendfrom cryptography.hazmat.primitives importserialization, hashesfrom cryptography.hazmat.primitives.asymmetric importrsa, paddingif __name__ == "__main__":

m= int.from_bytes(bytearray.fromhex(m), byteorder='big')

e= int.from_bytes(bytearray.fromhex(e), byteorder='big')

key=rsa.RSAPublicNumbers(e, m).public_key(default_backend())

pem=key.public_bytes(

encoding=serialization.Encoding.PEM,

format=serialization.PublicFormat.SubjectPublicKeyInfo

)

with open('key.pem', 'w+') as f:

f.writelines(pem.decode())

参考

https://github.com/pyca/cryptography/issues/2735

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值