Как зашифровать массив байтов с помощью Crypto++
Как я могу зашифровать байтовый массив с помощью реализации RSA Crypto ++? Я уже нашел пример для строк. Но я не могу найти хороший пример, как сделать то же самое для байтового массива.
Это моя первая попытка:
//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, но данные зашифрованы
Какой безопасный способ реализовать это? Я не хочу быть уязвимым для переполнения буфера или любой другой атаки.
1 ответ
байт * шифр = новый байт (размер);
Я считаю, что это должно быть:
byte * cipher = new byte[size];
В противном случае, я думаю, вы получите один байт, инициализированный до 6400 (который усекается до 0x00).
CryptoPP:: ArraySink * test = new CryptoPP:: ArraySink (шифр, размер);
Это немного по-другому. Вы можете остаться вне диспетчера памяти, если хотите:
CryptoPP::ArraySink test(cipher, size);
int newDataSize = test-> TotalPutLength ();
Я никогда не использовал TotalPutLength
, и я не видел его документально BufferedTransformation
или же Sink
, Так что у меня нет никаких советов о том, что он возвращает.
TotalPutLength
нормально использовать. ArraySink
может вернуть неправильное значение, если раковина была заполнена. Это произошло бы, если бы массив был фиксированным и слишком маленьким для всех данных. Мы решили эту проблему в 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
Теперь мы говорим;) Попробуйте это из вики Crypto ++ на RSA Encryption.
////////////////////////////////////////////////
// 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 );