AES加密/解密接收所有明文

时间:2018-06-03 15:27:50

标签: c++ aes crypto++

我正在做这个任务,我遇到了这个问题,如果我输入一个句子,例如:“你好我的名字是亚当”,它只会加密“你好”..但是当我把句子分配给明文,我得到一个完整的加密/解密句子。

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 :(得分:3)

而不是cin >> plaintext,请尝试std::getline(cin, plaintext)

在此上下文中,

operator>>将一直读到下一个空格,在这种情况下是&#34; Hello&#34;之后的空格字符。另一方面,std::getline将读取直到指定的分隔符;这里我们使用默认分隔符\n,因此它将读取整行。