You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:24:05