当我通过initialText86
时,下面的代码可以正常工作。当我通过initialText87
时,它无法构建StringSource ss1
,我们遇到异常invalid argument
!
如何编码长度为87的字符串?
#include <string>
#include <new>
using namespace std;
#include <../pub/cryptopp/rsa.h>
#include <../pub/cryptopp/osrng.h>
#include <../pub/cryptopp/oaep.h>
#include <../pub/cryptopp/sha.h>
using namespace CryptoPP;
AutoSeededRandomPool& rng_get() {
static AutoSeededRandomPool defRng;
return defRng;
}
string rsa_encode( const string& plainText, const RSA::PublicKey& pubKey ) {
RSAES_OAEP_SHA_Encryptor rsaEnc( pubKey );
string cipherText;
StringSource ss1( reinterpret_cast< const byte* >( plainText.c_str() ), plainText.size(), true,
new PK_EncryptorFilter( rng_get(), rsaEnc,
new StringSink( cipherText )
) // PK_EncryptorFilter
); // StringSource
return move( cipherText );
}
string rsa_decode( const string& cipherText, const RSA::PrivateKey& secretKey ) {
RSAES_OAEP_SHA_Decryptor rsaDec( secretKey );
string plainText;
StringSource ss2( reinterpret_cast< const byte* >( cipherText.c_str() ), cipherText.size(), true,
new PK_DecryptorFilter( rng_get(), rsaDec,
new StringSink( plainText )
) // PK_DecryptorFilter
); // StringSource
return move( plainText );
}
static const size_t keyLength = 1024;
RSA::PrivateKey _secretKey;
RSA::PublicKey _pubKey;
bool test( const string& initialText ) {
auto cipherText = rsa_encode( initialText, _pubKey );
auto plainText = rsa_decode( cipherText, _secretKey );
return plainText == initialText;
}
int main() {
_secretKey.GenerateRandomWithKeySize(rng_get(), keyLength );
new( &_pubKey ) RSA::PublicKey( _secretKey );
string initialText87 = "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
string initialText86 = "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
auto testResult = test( initialText87 );
assert( testResult );
return testResult ? 0 : -1;
}
答案 0 :(得分:1)
可以使用RSA加密的数据长度主要取决于您使用的密钥大小。您似乎正在使用OAEP,因此最大长度为:
keyLength - 2 - 2 * hashLength
其中keyLength
是RSA模数的长度(以字节为单位)。您正在使用1024位密钥:
keyLength = 1024 / 8 = 128
因为你正在使用OAEP和SHA-1
hashLength = 20
因此,您可以加密的最大值是:
128 - 2 - 2 * 20 = 86
这正是您的示例所示。
要加密更多数据,可以使用更大的RSA密钥,但RSA确实不应该用于加密大量数据,因此通常用作RSA的混合密码系统的一部分而是用于加密AES等对称算法的随机生成密钥,然后使用对称算法加密实际数据,从而避免与RSA相关的长度限制。