如何在 Crypto++ 中使用 RSA OAEP SHA-256 加密/解密数据

Posted

技术标签:

【中文标题】如何在 Crypto++ 中使用 RSA OAEP SHA-256 加密/解密数据【英文标题】:How to encrypt/decrypt data using RSA OAEP SHA-256 in Crypto++ 【发布时间】:2019-12-28 02:40:52 【问题描述】:

如何使用 SHA-256 填充而不是 Crypto++ 中的默认 SHA-1 填充来加密我的字符串数据?我无法找到任何方法来更改我的加密/解密函数使用的填充算法。我听说一些库有硬编码的填充方案,但我希望有一种方法可以修改 Crypto++ 使用的那个。

这是我的加密方法:

string GUIMain::encryptData(const string data) 
    CryptoPP::RSAES_OAEP_SHA_Encryptor e(*serverPublic);
    string cipher;
    CryptoPP::StringSource ss1(data, true, new CryptoPP::PK_EncryptorFilter(*rng, e, new CryptoPP::StringSink(cipher)));
    return cipher;

这是我的解密方法:

string GUIMain::decryptData(const string cipher) 
    CryptoPP::RSAES_OAEP_SHA_Decryptor d(*privateKey);
    string recovered;
    CryptoPP::StringSource ss2(cipher, true, new CryptoPP::PK_DecryptorFilter(*rng, d, new CryptoPP::StringSink(recovered)));
    return recovered;

键(*serverPublic*privateKey)分别是对象类型 RSA::PublicKeyRSA::PrivateKey*rng 是一个 AutoSeededRandomPool 对象。

有什么方法可以添加/更改这些方法以使其正常工作?我是 C++ 新手,所以请尽可能解释解决方案。

【问题讨论】:

作为新用户,您可能对Crypto++ wiki 和Crypto++ manual 感兴趣。 wiki 中塞满了示例代码,例如 RSA Cryptography 和 RSA Encryption Schemes。 【参考方案1】:

如何使用 SHA-256 填充而不是 Crypto++ 中的默认 SHA-1 填充来加密我的字符串数据?

RSAES_OAEP_SHA_EncryptorRSAES_OAEP_SHA_Decryptor 是 typedef:

$ grep RSAES_OAEP_SHA_Encryptor *.h
rsa.h:DOCUMENTED_TYPEDEF(RSAES<OAEP<SHA1> >::Encryptor, RSAES_OAEP_SHA_Encryptor);

$ grep RSAES_OAEP_SHA_Decryptor *.h
rsa.h:DOCUMENTED_TYPEDEF(RSAES<OAEP<SHA1> >::Decryptor, RSAES_OAEP_SHA_Decryptor);

您可以改用以下内容:

 RSAES<OAEP<SHA256> >

所以你的加密器和解密器是:

 RSAES<OAEP<SHA256> >::Encryptor
 RSAES<OAEP<SHA256> >::Decryptor

在模板的&gt; 之后保留额外的空间。旧版本的 C++ 语言需要它。否则,编译器看到&gt;&gt; 并认为它是提取运算符的一部分。


有几个 typedef 与您正在使用的类似:

$ grep RSAES *.h
...
rsa.h:struct RSAES : public TF_ES<RSA, STANDARD>
rsa.h:/// \brief \ref RSAES<STANDARD> "RSAES<PKCS1v15>::Decryptor" typedef
rsa.h:DOCUMENTED_TYPEDEF(RSAES<PKCS1v15>::Decryptor, RSAES_PKCS1v15_Decryptor);
rsa.h:/// \brief \ref RSAES<STANDARD> "RSAES<PKCS1v15>::Encryptor" typedef
rsa.h:DOCUMENTED_TYPEDEF(RSAES<PKCS1v15>::Encryptor, RSAES_PKCS1v15_Encryptor);
rsa.h:/// \brief \ref RSAES<STANDARD> "RSAES<OAEP<SHA1>>::Decryptor" typedef
rsa.h:DOCUMENTED_TYPEDEF(RSAES<OAEP<SHA1> >::Decryptor, RSAES_OAEP_SHA_Decryptor);
rsa.h:/// \brief \ref RSAES<STANDARD> "RSAES<OAEP<SHA1>>::Encryptor" typedef
rsa.h:DOCUMENTED_TYPEDEF(RSAES<OAEP<SHA1> >::Encryptor, RSAES_OAEP_SHA_Encryptor);

DOCUMENTED_TYPEDEFconfig_ns.h 中的宏。运行 make docs 时,该宏有助于生成更好的文档。

常规编译使用以下内容。

typedef RSAES<OAEP<SHA1> >::Encryptor RSAES_OAEP_SHA_Encryptor;

文档构建使用以下内容。继承在构建文档时效果更好。

struct RSAES_OAEP_SHA_Encryptor : RSAES<OAEP<SHA1> >::Encryptor

;

【讨论】:

以上是关于如何在 Crypto++ 中使用 RSA OAEP SHA-256 加密/解密数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用SunMSCAPI密钥解密RSA-OAEP

解密 C# 中使用 RSA-OAEP 在 JavaScript 中加密的数据时出现 OAEP 填充错误

使用Java和JavaScript之间的OAEP进行RSA加密

带有 RSACryptoServiceProvider.Encrypt 的 OAEP RSA 参数

为啥在使用私钥加密时不能使用 RSA OAEP 填充?

RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误