バイト * 暗号 = 新しいバイト (サイズ);
これは次のようにすべきだと思います:
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
で文書化されているのを見たことがありません。したがって、何が返されるかについてのアドバイスはありません。BufferedTransformation
Sink
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 );