Python使用PKCS1_OAEP加密后Java解密结果与原串不匹配求助
RSA-OAEP跨语言加解密结果不匹配问题排查
前置结论
你当前的RSA密钥配对、OAEP填充参数配置完全正确,否则解密过程会直接抛出BadPaddingException异常,不会返回明文结果。问题100%出在加解密前后的字节与字符串转换环节。
根因定位
你看到的解密结果中大量出现的+/v7类乱码,本质是UTF-8编码的替换字符(�)的可视化表现,触发原因是:你把非合法UTF-8编码的二进制字节直接强制转为了UTF-8字符串,非法字节被JVM默认替换为了�字符。
你的原始输入deUI1kjyzRH/EHBhg3c13A==本身是Base64编码后的字符串,对应16字节的二进制密钥,两端的处理逻辑没有对齐:
- 如果Python侧加密的是原始Base64字符串的UTF-8字节,Java侧解密后直接转字符串就能得到正确结果
- 如果Python侧加密的是原始Base64解码后的16位二进制密钥,Java侧解密后直接转字符串必然乱码,需要先把解密得到的二进制重新编码为Base64字符串再输出
解决步骤
- 第一步:对齐两端数据处理逻辑
选择以下任意一种方案,两端保持统一即可:方案A(处理字符串):Python加密前直接将原始Base64字符串用UTF-8编码为字节,Java解密后将得到的字节用UTF-8解码为字符串
方案B(处理二进制密钥):Python加密前先将原始Base64字符串解码为二进制字节,Java解密后将得到的二进制字节编码为Base64字符串再输出 - 第二步:修正Java侧代码的隐式字符集问题
显式指定字符集避免系统默认字符集差异,对应两种方案的代码如下:// 方案A对应代码 byte[] decryptBytes = cipher.doFinal(Base64.getDecoder().decode(sValue)); String result = new String(decryptBytes, StandardCharsets.UTF_8); System.out.println(result); // 方案B对应代码 byte[] decryptBytes = cipher.doFinal(Base64.getDecoder().decode(sValue)); String result = Base64.getEncoder().encodeToString(decryptBytes); System.out.println(result); - 第三步:确认密文传输环节无编码问题
Python侧加密得到二进制密文后,必须使用标准Base64编码为字符串后再传输给Java,不要直接传输二进制字节避免转义丢失。Python侧参考代码:import base64 # 加密得到encrypted_secret_key后转Base64字符串 encrypted_b64_str = base64.b64encode(encrypted_secret_key).decode('utf-8')
内容的提问来源于stack exchange,提问作者Dixit
相关产品推荐
相关产品推荐

