3

Crypto++ の RSA 実装でバイト配列を暗号化するにはどうすればよいですか? 文字列の例はすでに見つかりました。しかし、バイト配列に対して同じことを行う方法の良い例が見つかりません。

これは私の最初の試みです:

//dataSize:     Size of data that is going to be send
//dataToSend    Bytes to send to the user
//seedPool      is an AutoSeededRandomPool

CryptoPP::RSAES_OAEP_SHA_Encryptor encryptor(publicKey);

int size = 64000; 
byte * cipher = new byte(size);

CryptoPP::ArraySink* test = new CryptoPP::ArraySink(cipher, size);
CryptoPP::ArraySource as((byte*)dataToSend, dataSize, true, new CryptoPP::PK_EncryptorFilter(seedPool, encryptor, test));

int newDataSize = test->TotalPutLength();
unsigned int bytesSend = ::send(socketLink, (char *)(cipher), (int)newDataSize, 0);

delete[] cipher;

これはうまくいきません。TotalPutLengthは常に 0 を返しますが、暗号化されたデータがあります。

これを実装する安全な方法は何ですか? バッファ オーバーフローやその他の攻撃に対して無防備になりたくありません。

4

1 に答える 1

3

バイト * 暗号 = 新しいバイト (サイズ);

これは次のようにすべきだと思います:

byte * cipher = new byte[size];

それ以外の場合は、1 バイトが 6400 に初期化されると思います (これは 0x00 に切り捨てられます)。


CryptoPP::ArraySink * test = new CryptoPP::ArraySink(cipher, size);

これはちょっと違う。必要に応じて、メモリ マネージャーから離れることもできます。

 CryptoPP::ArraySink test(cipher, size);

int newDataSize = test->TotalPutLength();

を使用したことがなく、またはTotalPutLengthで文書化されているのを見たことがありません。したがって、何が返されるかについてのアドバイスはありません。BufferedTransformationSink

TotalPutLength使用してもOKです。シンクがいっぱいの場合、 AnArraySinkは間違った値を返す可能性があります。配列が固定されていて、すべてのデータに対して小さすぎる場合に発生します。この問題は、Crypto++ 5.6.3 または 5.6.4 で解決されました。

処理されたバイト数をカウントしたい場合 (シンクがそれらのバイトを保存できない場合でも)、次を使用することもできますMeterFilter

byte data[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };

string encoded;
MeterFilter meter( new StringSink( encoded ) );

ArraySource( data, sizeof( data ), true,
    new HexEncoder(
        new Redirector( meter ),
        true /*UCase*/, 2 /*Group*/,
        " " /*Separator*/
    )
);

cout << "processed " << meter.GetTotalBytes() << " bytes" << endl;
cout << encoded << endl;

出力:

Processed 23 bytes
00 01 02 03 04 05 06 07

Cryptopp RSA実装でバイト配列を暗号化するにはどうすればよいですか

今、私たちは話している ;) RSA 暗号化に関する Crypto++ wiki からこれを試してください。

////////////////////////////////////////////////
// Generate keys
AutoSeededRandomPool rng;

InvertibleRSAFunction params;
params.GenerateRandomWithKeySize( rng, 1536 );

RSA::PrivateKey privateKey( params );
RSA::PublicKey publicKey( params );

string plain="RSA Encryption", cipher, recovered;

////////////////////////////////////////////////
// Encryption
RSAES_OAEP_SHA_Encryptor e( publicKey );

StringSource ss1( plain, true,
    new PK_EncryptorFilter( rng, e,
        new StringSink( cipher )
    ) // PK_EncryptorFilter
 ); // StringSource

////////////////////////////////////////////////
// Decryption
RSAES_OAEP_SHA_Decryptor d( privateKey );

StringSource ss2( cipher, true,
    new PK_DecryptorFilter( rng, d,
        new StringSink( recovered )
    ) // PK_DecryptorFilter
 ); // StringSource

assert( plain == recovered );
于 2014-01-10T03:49:16.243 に答える