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

Python cryptography RSA加密密钥,Rust OpenSSL解密失败如何适配Padding?

解决Rust OpenSSL解密Python cryptography RSA OAEP加密数据的问题

核心原因:参数不匹配

你遇到的padding校验失败,本质是Python cryptography的OAEP加密参数和Rust OpenSSL的解密参数没对齐——OAEP对哈希算法、MGF1算法、label的一致性要求极高,哪怕有一项不匹配就会解密失败。

具体调整方案

1. 固化Python端加密的参数

确保代码里明确指定所有OAEP参数,别依赖默认值(避免不同版本库的默认行为差异):

from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes

# 加密32字节随机密钥的代码
encrypted_key = public_key.encrypt(
    your_32byte_random_key,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

2. Rust端解密时显式指定匹配参数

OpenSSL的Padding::PKCS1_OAEP默认可能用SHA1当哈希,必须手动改成SHA256,同时指定label为空:

use openssl::rsa::Rsa;
use openssl::pkey::PKey;
use openssl::hash::MessageDigest;
use openssl::padding::Padding;

// 解密逻辑示例
let private_key = Rsa::private_key_from_pem(&your_private_key_pem).unwrap();
let pkey = PKey::from_rsa(private_key).unwrap();
let mut decrypted_buf = vec![0; pkey.size() as usize];

let decrypted_len = pkey.private_decrypt(
    &encrypted_key_bytes,
    &mut decrypted_buf,
    Padding::PKCS1_OAEP,
    Some(MessageDigest::sha256()), // OAEP哈希算法和Python端一致
    Some(MessageDigest::sha256()), // MGF1哈希算法也和Python端一致
    None // label设为None,和Python端匹配
).unwrap();

// 取出实际解密后的32字节密钥
let decrypted_key = &decrypted_buf[..decrypted_len];

3. 排查其他可能的坑

  • 确认加密用的公钥和解密用的私钥是同一密钥对,别搞混了
  • RSA密钥长度要足够:加密32字节密钥至少需要2048位RSA密钥(4096位更稳妥)
  • 别混淆padding模式:之前用subprocess调用OpenSSL加密默认是PKCS#1 v1.5,所以Rust用Padding::PKCS1能解;现在换成OAEP加密,必须用Padding::PKCS1_OAEP解密,不能再用旧的padding模式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:01:29