如何在Python中实现微软API要求的RSA加密OTP提交?
问题分析与解决方向
首先,不需要直接手动转译整个JS加密逻辑,大概率是你使用Python rsa模块时的参数或填充方式和微软JS加密逻辑不匹配导致的,核心要对齐两者的加密参数细节:
先明确JS加密的具体参数
你提到的“特定PKCSv2填充”通常指RSA-OAEP(PKCS#1 v2.1)填充,需要确认JS代码里的关键参数:- 哈希算法(比如SHA-1、SHA-256)
- MGF1函数使用的哈希算法(通常和主哈希一致,但也可能不同)
- 是否设置了自定义Label参数
- OTP字符串的编码方式(比如UTF-8、ASCII)
检查Python rsa模块的使用是否匹配
Python的rsa模块默认行为可能和JS逻辑不符:- 若JS用的是OAEP填充,
rsa.encrypt默认是PKCS#1 v1.5填充,必须改用rsa.pkcs1.encrypt_oaep方法,并指定对应的哈希算法和Label:import rsa from rsa import pkcs1 # 假设已加载好微软提供的公钥 otp = "你的OTP字符串" encrypted_data = pkcs1.encrypt_oaep( otp.encode("utf-8"), public_key=public_key, hash_method=rsa.hash.SHA256, # 匹配JS的哈希算法 label=b"" # 若JS有自定义Label则对应传入,否则为空字节 ) # 转成API要求的格式(比如base64或十六进制) encrypted_base64 = encrypted_data.hex() # 或base64.b64encode(encrypted_data).decode() - 如果
rsa模块的OAEP支持无法满足JS的参数(比如某些特殊哈希算法),可以改用更灵活的cryptography库来实现:from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives import serialization # 加载公钥(假设是PEM格式) with open("public_key.pem", "rb") as f: public_key = serialization.load_pem_public_key( f.read() ) otp = "你的OTP字符串" encrypted_data = public_key.encrypt( otp.encode("utf-8"), padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None # 匹配JS的Label设置 ) )
- 若JS用的是OAEP填充,
验证加密结果一致性
用同一OTP、同一公钥,分别用JS和Python加密,对比加密后的字节流(或base64编码值)。如果不一致,逐步排查每个参数:编码方式、哈希算法、填充类型、Label值,直到参数完全对齐。何时需要手动转译?
只有当JS的加密逻辑包含非标准的自定义修改(比如对PKCS#1 v2.1填充规则做了额外字节处理)时,才需要手动转译逻辑。但微软官方API的加密逻辑通常遵循标准,所以优先排查参数对齐问题。
内容的提问来源于stack exchange,提问作者some_dev
相关产品推荐
相关产品推荐

