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

