Задание: реализовать интерфейс для функции потокового шифрования (OTP + PRG)
Решение: используем бибилиотеку Crypto++® Library 8.4 В качестве псевдослучайного генератора используем ChaCha20
#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;
void KeyGen(SecByteBlock &key, SecByteBlock &iv)
{
AutoSeededRandomPool prng;
prng.GenerateBlock(key, key.size());
prng.GenerateBlock(iv, iv.size());
}
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());
}
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());
}