Зашифруйте аудиофайл с помощью AES и XTR-DH Crypto ++ - PullRequest
0 голосов
/ 08 октября 2018

Я написал код для шифрования аудиофайла в формате WAV с режимом AES CFB и XTR-DH для генерации секретного ключа.

Код здесь

int main()
{
AutoSeededRandomPool aSRPA;
XTR_DH xtrA(aSRPA, 170, 160);

string inputfilename;
string encryptfilename;
int aesKeyLength = SHA256::DIGESTSIZE;
int defBlockSize = AES::BLOCKSIZE;
const std::string extention(".wav");

byte iv[AES::BLOCKSIZE];
aSRPA.GenerateBlock(iv, AES::BLOCKSIZE);
SecByteBlock privateA(xtrA.PrivateKeyLength());
SecByteBlock publicA(xtrA.PublicKeyLength());
SecByteBlock secretKeyA(xtrA.AgreedValueLength());
xtrA.GenerateKeyPair(aSRPA, privateA, publicA);

SecByteBlock key(SHA256::DIGESTSIZE);
SHA256().CalculateDigest(key, secretKeyA, secretKeyA.size());

cout << "file path plain text : ";
cin >> inputfilename;
cout << "file path cipher text : ";
cin >> encryptfilename;

        if (inputfilename != extention &&
            encryptfilename != extention &&
            inputfilename.size() > extention.size() &&
            encryptfilename.size() > extention.size() &&
            inputfilename.substr(inputfilename.size() - extention.size()) == 
            ".wav" &&
            encryptfilename.substr(encryptfilename.size() - 
            extention.size()) == ".wav")
        {


            CFB_Mode<AES>::Encryption cfbEncryption(key, aesKeyLength, iv);
            cfbEncryption.ProcessData((byte*)inputfilename.c_str(), 
                                      (byte*)inputfilename.c_str(), 
                                      inputfilename.length() + 1);


            FileSink file_kunci(encryptfilename.c_str());
            StringSource ss(inputfilename, true,
                new StreamTransformationFilter(cfbEncryption,
                    new Redirector(file_kunci)));
         }
}

Это работаетно когда я читаю зашифрованный файл, это не волновая форма, как аудиофайл.Что не так с моим кодом?Нужно ли преобразовывать аудиофайл в массив байтов или что-то в этом роде?

1 Ответ

0 голосов
/ 08 октября 2018

Непонятно, что вы на самом деле хотите, так как заголовок вашего вопроса и код отличаются, поэтому я собираюсь взять ваш код в качестве ссылки.Для меня это выглядит так, будто вы хотите зашифровать файл и расшифровать его позже.

Ваш большой блок на самом деле слишком много ... вы можете делать все довольно легко с std::filesystem.

Также вы, похоже, все перепутываете, это может произойти, если вы не знакомы с алгоритмами шифрования и / или документацией самой библиотеки.Сначала вы ProcessData, который, кажется, зашифровывает строку в inputfilename (?).

В конце концов, вы можете захотеть взглянуть на документацию библиотеки и предоставленные примеры - они уже помогут ваммногое понять, как все это обрабатывается.

Вот рабочий автономный пример шифрования и дешифрования файла.

#include <filesystem>

#include "..\CryptoLib\osrng.h"
#include "..\CryptoLib\modes.h"
#include "..\CryptoLib\files.h"
#include "..\CryptoLib\aes.h"

template <typename T, std::size_t N>
constexpr std::size_t FixedArraySize(T(&arr)[N])
{ return N; }

int wmain(int argv, wchar_t **args)
{
    try
    {
        using namespace CryptoPP;

        constexpr CryptoPP::byte    IV[]    = { 0xab,0x10,0x55,0x29,0x73,0xb9,0xae,0xba,0xe9,0xe9,0xe5,0x26,0x35,0x66,0x63,0x55 };
        constexpr char              key[]   = "ABCDEFGHIJKLMNOP";

        const std::string extension         = ".TEST";
        const std::string sourceFile        = __FILE__;
        const std::string destinationFile   = std::filesystem::path("Encrypted").replace_extension(extension).string();
        const std::string finalFile         = std::filesystem::path("Decrypted").replace_extension(extension).string();

        {
            CFB_Mode<AES>::Encryption encryption(reinterpret_cast<const CryptoPP::byte*>(key), FixedArraySize(key) - 1, IV);
            FileSource fsEnc(sourceFile.c_str(), true, new StreamTransformationFilter(encryption, new FileSink(destinationFile.c_str())));

            CFB_Mode<AES>::Decryption decryption(reinterpret_cast<const CryptoPP::byte*>(key), FixedArraySize(key) - 1, IV);
            FileSource fsDec(destinationFile.c_str(), true, new StreamTransformationFilter(decryption, new FileSink(finalFile.c_str())));
        }

        std::filesystem::remove(destinationFile);
        std::filesystem::remove(finalFile);
    }
    catch (const std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }
}
...