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

Crypto++使用raw RSA加解密时新密钥可解密旧密文如何修复

RSA密钥重生成后仍能解密旧密文的修复方案

根因分析

  • 最高发原因:随机数生成器(RNG)未正确初始化,导致每次生成的RSA密钥对参数完全一致,看似换了密钥实际还是同一套,自然可以解密旧密文
  • 次要原因:重新生成密钥时未完全覆盖旧的公/私钥对象,旧参数残留导致实际调用解密时用的还是最初的密钥
  • 补充说明:你当前使用的raw RSA(无填充的教科书式RSA)属于不安全实现,仅适合学习测试,生产环境必须切换为带安全填充的RSA模式

修复步骤

1. 正确初始化随机数生成器

必须使用从系统熵池取种的随机数生成器,不要使用固定种子的伪随机数生成器,否则每次生成的密钥都会完全相同,初始化示例:

#include <osrng.h>
// AutoSeededRandomPool会自动从系统熵池取种,无需手动传入固定种子
CryptoPP::AutoSeededRandomPool rng;

2. 修正密钥生成与覆盖逻辑

重新生成密钥时要确保旧的密钥对象被完全重写,推荐用更简洁的AssignFrom方法赋值,避免手动传参出错,完整代码如下:

#include <rsa.h>

// 生成新的RSA参数
CryptoPP::InvertibleRSAFunction params;
params.GenerateRandomWithKeySize(rng, 4096);

// 完全覆盖旧的公钥、私钥参数
publicKey.AssignFrom(params);
privateKey.AssignFrom(params);

// 可选验证:打印模数的前若干字节,确认每次生成的密钥不同
// std::cout << "当前密钥模数前8字节:" << std::hex << params.GetModulus() << std::endl;

你之前手动传递模数、公指数、私指数的初始化逻辑本身没有语法错误,但AssignFrom方法可以避免参数传递顺序错误、漏传参数等问题。

3. 生产环境替换为带填充的安全RSA实现

raw RSA存在大量已知安全漏洞,推荐切换为OAEP填充的加解密模式,解密示例代码如下:

#include <oaep.h>
#include <sha.h>
#include <filters.h>

CryptoPP::RSAES_OAEP_SHA_Decryptor decryptor(privateKey);
CryptoPP::AutoSeededRandomPool decRng;
std::string plaintext;

CryptoPP::StringSource ss(ciphertext, true,
    new CryptoPP::PK_DecryptorFilter(decRng, decryptor,
        new CryptoPP::StringSink(plaintext)
    )
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:24:03