Frage

Wenn ich vorbeigehe initialText86, der folgende Code funktioniert wie er sollte.Wenn ich vorbeigehe initialText87 es gelingt nicht, es zu konstruieren StringSource ss1, und wir treffen auf eine Ausnahme invalid argument!

Wie kann ich einen String mit der Länge 87 kodieren?

#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;
}
War es hilfreich?

Lösung

Die Länge der Daten, die mit RSA verschlüsselt werden können, wird hauptsächlich durch die Größe des verwendeten Schlüssels bestimmt.Sie scheinen OAEP zu verwenden, daher beträgt die maximale Länge:

keyLength - 2 - 2 * hashLength

Wo keyLength ist die Länge des RSA-Moduls in Bytes.Sie verwenden einen 1024-Bit-Schlüssel, also:

keyLength = 1024 / 8 = 128

Und da Sie OAEP mit SHA-1 verwenden

hashLength = 20

Sie können also maximal Folgendes verschlüsseln:

128 - 2 - 2 * 20 = 86

Das ist genau das, was Ihr Beispiel zeigt.

Um mehr Daten zu verschlüsseln, müssen Sie könnte Verwenden Sie einen größeren RSA-Schlüssel, aber RSA sollte eigentlich nicht zum Verschlüsseln großer Datenmengen verwendet werden und wird daher normalerweise als Teil eines hybriden Kryptosystems verwendet, bei dem RSA stattdessen zum Verschlüsseln eines zufällig generierten Schlüssels für einen symmetrischen Algorithmus wie AES verwendet wird Anschließend wird der symmetrische Algorithmus verwendet, um die tatsächlichen Daten zu verschlüsseln und so die mit RSA verbundenen Längenbeschränkungen zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top