Объяснение Лабораторной работы № 1

Задание: реализовать интерфейс для функции потокового шифрования (OTP + PRG)

Решение: используем бибилиотеку Crypto++® Library 8.4 В качестве псевдослучайного генератора используем ChaCha20

  1. Подключаем необходимые хэдеры библиотеки и задаем namespace CryptoPP
  2. 
    #include "cryptlib.h"
    #include "secblock.h" // 32 байтный блок данных https://stackoverflow.com/questions/39751312/advantages-of-secbyteblock-class-from-crypto
    #include "chacha.h" // подключаем генератор Chacha
    #include "osrng.h" // подключаем AutoSeededRandomPool
    #include "files.h"
    #include "hex.h" // для красивого вывода
    
    #include 
    #include 
    
    using namespace CryptoPP;
  3. Генерируем секретный ключ. Для этого выбираем случайный генератор из списка возможных (стандартный AutoSeededRandomPool).
    Функция GenerateBlock берет на вход тип SecByteBlock (или byte*) A и unsigned int B, генерирует массив длины B случайных байт, записывает результат в А. Вызываем функцию дважды для генераци ключа key и инициализирующего значения iv (спецификация реализации ChaCha20 в crypto++)
  4. 
    void KeyGen(SecByteBlock &key, SecByteBlock &iv)
    {
    	AutoSeededRandomPool prng;
    	prng.GenerateBlock(key, key.size());
    	prng.GenerateBlock(iv, iv.size());
    }
  5. Реализовываем функцию шифрования. Подаем на вход ключ, состоящий из пары (key,iv), строку открытого текста plaintext, и переменную ciphertext, куда будет записан шифр-текст.
    Для этого формируем объект enc типа Encryption, у которого реализованы методы SetKeyWithIV (задание ключа), и метод шифрования ProcessData с сигнатурой void ProcessData(byte *outString, const byte *inString, size_t length);
  6. 
    void Enc(SecByteBlock &key, SecByteBlock &iv, std::string &plaintext, std::string &ciphertext)
    {
    	// Encryption object
    	ChaCha::Encryption enc;
    	enc.SetKeyWithIV(key, key.size(), iv, iv.size());
    
    	// Perform the encryption
    	ciphertext.resize(plaintext.size());
    	enc.ProcessData((byte*)&ciphertext[0], (const byte*)plaintext.data(), plaintext.size());
    }
     
  7. Реализовываем функцию дешифрования аналогично функции шифрования.
  8. 
    void Dec(SecByteBlock &key, SecByteBlock &iv, std::string &ciphertext, std::string &decrypted)
    {
    	// Decryption object
    	ChaCha::Decryption dec;
    	dec.SetKeyWithIV(key, key.size(), iv, iv.size());
    
    	// Perform the decryption
    	decrypted.resize(ciphertext.size());
    	dec.ProcessData((byte*)&decrypted[0], (const byte*)ciphertext.data(), ciphertext.size());
    }
     
Исходный код лабораторной работы здесь.