cryptopp明文固定长度限制

时间:2014-08-01 00:12:00

标签: exception rsa crypto++

当我通过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;
}

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相关的长度限制。