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
相关产品推荐
相关产品推荐

