最近需要对接一个JS前端,采用了如下文件
security.js
/*
* RSA, a suite of routines for performing RSA public-key computations in JavaScript.
* Copyright 1998-2005 David Shapiro.
* Dave Shapiro
* dave@ohdave.com
* changed by Fuchun, 2010-05-06
* fcrpg2005@gmail.com
*/
但是Python端并没有相应的库,网上的记录大多异常繁琐,特此记录下踩坑过程
var modulus ="00A828DB9D028A4B9FC017821C119DFFB8537ECEF7F91D4BC06DB06CC8B4E6B2D0A949B66A86782D23AA5AA847312D91BE07DC1430C1A6F6DE01A3D98474FE4511AAB7E4E709045B61F17D0DC4E34FB4BE0FF32A04E442EEE6B326D97E11AE8F23BF09926BF05AAF65DE34BB90DEBDCEE475D0832B79586B4B02DEED2FC3EA10B3";
var exponent ="010001";
var key = RSAUtils.getKeyPair(exponent, '', modulus);
phoneNum = RSAUtils.encryptedString(key,phoneNum);
最终实现代码
def rsa_no_padding(modulus, exponent):
m = int(modulus, 16)
e = int(exponent, 16)
# 16进制转10进制
t = '13888888888'[::-1].encode('utf-8')
# 字符串逆向并转换为bytes
input_nr = int.from_bytes(t, byteorder='big')
# 将字节转化成int型数字,如果没有标明进制,看做ascii码值
crypt_nr = pow(input_nr, e, m)
# 计算x的y次方,如果z在存在,则再对结果进行取模,其结果等效于pow(x,y) %z
length = ceil(m.bit_length() / 8)
# 取模数的比特长度(二进制长度),除以8将比特转为字节
crypt_data = crypt_nr.to_bytes(length, byteorder='big')
# 将密文转换为bytes存储(8字节),返回hex(16字节)
return crypt_data.hex()