Возможно ли создать новый объект Encryption
, который имеет такое же внутреннее состояние, что и ранее созданный объект Encryption
(мне нужно это, чтобы поддерживать только IV между вызовами функций, а не весь объект)?Как получить/установить внутреннее состояние объекта шифрования CFB_Mode?
Я думал, что это должно быть возможно с помощью функции GetNextIV
, но я не получил нужный результат. В следующем примере строка This is the text
будет закодирован и правильный закодированный текст:
94-41-d2-d4-06-05-f6-cd-d0-25-d6-f4-f6-52-55-7b-7c-
Но я получаю:
94-a8-a9-b3-e0-a9-b3-e0-b4-a8-a5-e0-b4-a5-b8-b4-c0-
Как вы можете видеть только первый байт (94
) кодируется правильно. Вы можете попробовать его со следующим примером кода:
#include <iostream>
#include <iomanip>
#include <crypto++/modes.h>
#include <crypto++/aes.h>
#include <crypto++/osrng.h>
using namespace CryptoPP;
void printHex(const byte in) {
std::cout << std::setfill('0') << std::setw(2) << std::hex << (int)in << "-";
}
int main() {
// Generate a random key and IV
AutoSeededRandomPool rnd;
SecByteBlock key(0x00, AES::DEFAULT_KEYLENGTH);
rnd.GenerateBlock(key, key.size());
byte iv[AES::BLOCKSIZE];
rnd.GenerateBlock(iv, AES::BLOCKSIZE);
// Encrypt byte by byte
// this results in the correct encrypted text
byte text[] = "This is the text";
int msgLen = sizeof(text);
CFB_Mode<AES>::Encryption cfbEncB(key, key.size(), iv);
for (byte* beg = &text[0]; beg != &text[msgLen]; ++beg) {
printHex(cfbEncB.ProcessByte(*beg));
}
std::cout << std::endl;
// Encrypt byte by byte only keeping IV for each iteration
// This is not the expected output, how to get it right?
byte nextiv[AES::BLOCKSIZE];
std::copy(&iv[0], &iv[AES::BLOCKSIZE], &nextiv[0]);
for (byte* beg = &text[0]; beg != &text[msgLen]; ++beg) {
CFB_Mode<AES>::Encryption cfbEncC(key, key.size(), nextiv);
printHex(cfbEncC.ProcessByte(*beg));
cfbEncC.GetNextIV(nextiv);
}
std::cout << std::endl;
}
Благодарим вас за ответ.Как установить состояние, как вы думаете, мне нужно вызвать 'SetKeyWithIV' с ранее извлеченным значением' m_temp' или 'm_register'? –