1

好吧,这些天我一直在经历我的个人地狱

我在解密使用 RSA 加密的消息时遇到了一些问题,并且总是以“RSA/OAEP-MGF1(SHA-1): invalid ciphertext”失败

  1. 我有一个用 base64 编码的私钥并加载它:

        RSA::PrivateKey private_key;
        StringSource file_pk(PK,true,new Base64Decoder);
        private_key.Load( file_pk );
    
  2. 然后我继续通过执行以下操作来解码消息:

    RSAES_OAEP_SHA_Decryptor decryptor(private_key);
    
    AutoSeededRandomPool rng;
    
    string result;
    StringSource(ciphertext, true,
        new PK_DecryptorFilter(rng, decryptor,
            new StringSink(result)
        )
    );
    

据我所知,应该毫无问题地解析消息。密文是一个 std::string,所以最后没有 \0 可能会做一些意想不到的事情。

我只是想到了一些事情,如果私钥不正确但无论如何都可以加载而不会引发 BER 解码错误怎么办。解密时会抛出什么?

希望任何人都可以对此有所了解。

干杯

4

1 回答 1

0

如果密钥实际上已损坏,则加载功能应该失败。但是,您可以通过调用来询问自检密钥,这应该检测到任何损坏Validate,例如:

bool key_ok = private_key.Validate(rng, 3);

第二个参数(此处为 3)指定要进行多少检查。对于 RSA,这将导致它运行所有可用的测试,甚至是缓慢/昂贵的测试。

解码可能失败的另一个原因是,如果密钥根本不是用于加密原始消息的密钥。

显然,密文输入必须与加密端最初产生的密文完全相同。对于调试,检查这一点的一种好方法是将两侧的密文输入哈希函数(当然,您已经很方便地使用了)并比较输出。如果您对密文进行十六进制或 base64 编码以进行传输,则必须先撤消该密文,然后再将其提供给 RSA 解密器。

于 2010-06-14T18:33:22.780 回答