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

Python cryptography库RSA加密后Java解密触发BadPaddingException问题

问题原因

核心是Java和Python的OAEP填充参数默认配置不匹配:

  • Python cryptography库中你显式指定了OAEP的两套哈希参数:主哈希为SHA256,MGF1掩码生成函数的哈希也为SHA256,二者配置一致
  • 但Java中Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding")的默认配置为:主哈希为SHA256,MGF1的哈希默认使用SHA1,和Python侧参数不一致,导致填充校验失败抛出javax.crypto.BadPaddingException
解决方案

有两种可选方案,任选其一即可保证两侧参数对齐:

方案1:修改Java侧解密配置,显式指定MGF1的哈希为SHA256

调整Java解密部分的Cipher初始化逻辑,显式声明OAEP参数,和Python侧配置对齐,安全性更高,优先推荐:

import javax.crypto.spec.OAEPParameterSpec;
import javax.crypto.spec.PSource;
import java.security.spec.MGF1ParameterSpec;

// 原有代码保持不变,仅替换解密try块内的Cipher初始化部分
try {
    Cipher rsaCipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
    // 显式指定MGF1使用SHA256哈希,和Python侧配置一致
    OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT);
    rsaCipher.init(Cipher.DECRYPT_MODE, priv, oaepParams);
    decrypted = rsaCipher.doFinal(ct);
} catch (Exception e) {
    e.printStackTrace();
    return;
}

方案2:修改Python侧加密配置,适配Java默认参数

将Python侧MGF1的哈希改为SHA1,和Java默认配置对齐:

# 首先导入SHA1哈希
from cryptography.hazmat.primitives.hashes import SHA1

# 替换加密时的padding配置
ciphertext = pub_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA1()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

内容的提问来源于stack exchange,提问作者mpapoulias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:24:08