AES шифрует / дешифрует весь открытый текст - PullRequest
0 голосов
/ 03 июня 2018

Я делаю это назначение, и я столкнулся с этой проблемой, когда, если я ввожу предложение, например: «Привет, меня зовут Адам», оно будет зашифровывать только «Привет» .. Но когда я назначаю предложение в виде открытого текстаЯ получаю полное зашифрованное / расшифрованное предложение.

AutoSeededRandomPool rnd;

// Generate a random key
SecByteBlock key(0x00, AES::DEFAULT_KEYLENGTH);
rnd.GenerateBlock( key, key.size() );

// Generate a random IV
SecByteBlock iv(AES::BLOCKSIZE);
rnd.GenerateBlock(iv, iv.size());

// Read phrase
std::string plaintext;
cin >> plaintext;

std::string ciphertext;
std::string decryptedtext;

// encrypt
CTR_Mode<AES>::Encryption cfbEncryption(key, key.size(), iv);
CryptoPP::StreamTransformationFilter stfEncryptor(cfbEncryption, new CryptoPP::StringSink( ciphertext ) );
stfEncryptor.Put( reinterpret_cast<const unsigned char*>( plaintext.c_str() ), plaintext.length() + 1 );
stfEncryptor.MessageEnd();

cout << ciphertext << endl;

// decrypt
CTR_Mode<AES>::Decryption cfbDecryption(key, key.size(), iv);
CryptoPP::StreamTransformationFilter stfDecryptor(cfbDecryption, new CryptoPP::StringSink( decryptedtext ) );
stfDecryptor.Put( reinterpret_cast<const unsigned char*>( ciphertext.c_str() ), ciphertext.size() );
stfDecryptor.MessageEnd();

cout << decryptedtext << endl;

Может кто-нибудь объяснить ..?Я не совсем понимаю, как это работает ... Мне нужно пользовательский ввод для этого назначения.Есть ли способ, где я могу получить пользовательский ввод и получить полное зашифрованное предложение?

1 Ответ

0 голосов
/ 03 июня 2018

Вместо cin >> plaintext, попробуйте std::getline(cin, plaintext).

operator>> в этом контексте будет считываться до следующего пробела, который в данном случае является пробелом после «Hello».С другой стороны, std::getline будет читать до указанного разделителя;здесь мы используем разделитель по умолчанию \n, поэтому он будет читать всю строку.

...