crypto C++ AES Запечатать в функции

257
29 июня 2018, 05:40

Хочу сделать сложное более простым. Пытаюсь сделать две функции Кодирования и декодирования Строки паролем есть рабочий пример с файлами но в функции запечатать не получается.

(Помогите разобраться с функциями)

честно говоря хочу сделать функции и забыть всё, пользоваться простыми функциями в обще не понимаю зачем так усложнять задачу. Почему не сделать просто Функция(текст,пароль) всё.

Возможно у кого то есть готовые функции поделитесь пожалуйста.

Мой не рабочий пример

#include <iostream>
#include <iomanip>
#include <fstream>
#include<cryptopp\modes.h>
#include<cryptopp\aes.h>
#include<cryptopp\filters.h>
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <wincrypt.h>
#include <bcrypt.h>
#include <string.h>
#include <iostream>
#include <tchar.h>
#include <io.h>
using namespace CryptoPP;
using namespace std;
#pragma comment (lib,"cryptlib.lib")

int AEScrypto(string &S,string pass2)
{
    CHAR pass[65];
    strcpy(pass,pass2.c_str());
    HCRYPTPROV hProv; //дескриптор криптопровайдера
    HCRYPTKEY hKey; //дескриптор ключа, созданного из хэш-кода
    HCRYPTHASH hHash; //дескриптор хэш-объекта
    if (!CryptAcquireContext(&hProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0))
    {
        std::cout << "Error\n";
        return 1;
    }
    if(!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash))
    {
        std::cout << "Error\n";
        CryptReleaseContext(hProv, 0);
        return 1;
    }
    if (!CryptHashData(hHash, (BYTE *)pass, strlen(pass), 0))
    {
        std::cout << "Error\n";
        CryptDestroyHash(hHash);
        CryptReleaseContext(hProv, 0);
        return 1;
    }
    if (!CryptDeriveKey(hProv, CALG_AES_192, hHash, CRYPT_EXPORTABLE, &hKey))
    {
        std::cout << "Error\n";
        CryptDestroyHash(hHash);
        CryptReleaseContext(hProv, 0);
        return 1;
    }
    //std::ifstream ifs("data.txt", std::ifstream::binary);
    //ifs.seekg(0, ifs.end);
    //int len = ifs.tellg();
    //ifs.seekg(0);
    int len = S.size();
    std::vector<char> data(len + 10240);
    //std::vector<char>data;

    for(int i = 0;i < S.size();i++)
    {
        data[i]=(S[i]);
    }
    //cout<<len;
   // ifs.read(data.data(), len);
    //ifs.close();
    DWORD datalen = len;
    if (!CryptEncrypt(hKey, NULL, true, 0, reinterpret_cast<BYTE *>(data.data()), &datalen, data.size()))
    { 
        std::cout << "Error os\n";
        return 0;
    }
    else
    {
        /*std::ofstream ofs("data_enc.txt", std::ifstream::binary);
        ofs.write(data.data(), datalen);
        ofs.close();*/
        S = "";
        for(int i = 0;i < data.size();i++)
        {
            S+= data[i];
            //cout<<data[i]<<endl;
        }
    }
    CryptDestroyHash(hHash);
    CryptDestroyKey(hKey);
    CryptReleaseContext(hProv, 0);
    return 1;
}

int AESdecrypto(string &S,string pass2)
{
    CHAR pass[65];
    strcpy(pass,pass2.c_str());
    HCRYPTPROV hProv; //дескриптор криптопровайдера
    HCRYPTKEY hKey; //дескриптор ключа, созданного из хэш-кода
    HCRYPTHASH hHash; //дескриптор хэш-объекта
     if (!CryptAcquireContext(&hProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0))
    {
        std::cout << "Error\n";
        return 1;
    }
    if(!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash))
    {
        std::cout << "Error\n";
        CryptReleaseContext(hProv, 0);
        return 1;
    }
    if (!CryptHashData(hHash, (BYTE *)pass, strlen(pass), 0))
    {
        std::cout << "Error\n";
        CryptDestroyHash(hHash);
        CryptReleaseContext(hProv, 0);
        return 1;
    }
    if (!CryptDeriveKey(hProv, CALG_AES_192, hHash, CRYPT_EXPORTABLE, &hKey))
    {
        std::cout << "Error\n";
        CryptDestroyHash(hHash);
        CryptReleaseContext(hProv, 0);
        return 1;
    }
   // ifs.open("data_enc.txt", std::ifstream::binary);
   // ifs.seekg(0, ifs.end);
   // len = ifs.tellg();
   // ifs.seekg(0);
        int len = S.size();
    std::vector<char> data(len + 10240);
    //std::vector<char>data;

    for(int i = 0;i < S.size();i++)
    {
        data[i]=(S[i]);
    }

    data.resize(len + 10240);
    DWORD datalen = len;
   // ifs.read(data.data(), len);
    //ifs.close();
    datalen = len;
    if (!CryptDecrypt(hKey, NULL, true, 0, reinterpret_cast<BYTE *>(data.data()), &datalen))
    { 
        std::cout << "Error\n";
    }
    else
    {
       /* std::ofstream ofs("data_dec.txt", std::ifstream::binary);
        ofs.write(data.data(), datalen);
        ofs.close();*/
        S = "";
        for(int i = 0;i < data.size();i++)
        {
            S+= data[i];
            //cout<<data[i]<<endl;
        }
    }
    CryptDestroyHash(hHash);
    CryptDestroyKey(hKey);
    CryptReleaseContext(hProv, 0);
}
int main(int argc, char* argv[]) {

    string S123 = "CryptoText Ctypt";

    std::cout<<AEScrypto(S123,"123456");
    cout<<"\n"<<S123<<std::endl;
    cin.get();
    std::cout<<AESdecrypto(S123,"123456");
    cout<<"\n"<<S123<<std::endl;
    system("pause");
    return 0;
}

Рабочий пример с фалами

#include <iostream>
#include <iomanip>
#include <fstream>
#include<cryptopp\modes.h>
#include<cryptopp\aes.h>
#include<cryptopp\filters.h>
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <wincrypt.h>
#include <bcrypt.h>
#include <string.h>
#include <iostream>
#include <tchar.h>
#include <io.h>
using namespace CryptoPP;
using namespace std;
#pragma comment (lib,"cryptlib.lib")

int main(int argc, char* argv[]) {

     CHAR pass[65];
    std::cin >> pass;
    HCRYPTPROV hProv; //дескриптор криптопровайдера
    HCRYPTKEY hKey; //дескриптор ключа, созданного из хэш-кода
    HCRYPTHASH hHash; //дескриптор хэш-объекта
    if (!CryptAcquireContext(&hProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0))
    {
        std::cout << "Error\n";
        return 1;
    }
    if(!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash))
    {
        std::cout << "Error\n";
        CryptReleaseContext(hProv, 0);
        return 1;
    }
    if (!CryptHashData(hHash, (BYTE *)pass, strlen(pass), 0))
    {
        std::cout << "Error\n";
        CryptDestroyHash(hHash);
        CryptReleaseContext(hProv, 0);
        return 1;
    }
    if (!CryptDeriveKey(hProv, CALG_AES_192, hHash, CRYPT_EXPORTABLE, &hKey))
    {
        std::cout << "Error\n";
        CryptDestroyHash(hHash);
        CryptReleaseContext(hProv, 0);
        return 1;
    }
    std::ifstream ifs("data.txt", std::ifstream::binary);
    ifs.seekg(0, ifs.end);
    int len = ifs.tellg();
    ifs.seekg(0);
    std::vector<char> data(len + 10240);
    ifs.read(data.data(), len);
    ifs.close();
    DWORD datalen = len;
    if (!CryptEncrypt(hKey, NULL, true, 0, reinterpret_cast<BYTE *>(data.data()), &datalen, data.size()))
    { 
        std::cout << "Error\n";
    }
    else
    {
        std::ofstream ofs("data_enc.txt", std::ifstream::binary);
        ofs.write(data.data(), datalen);
        ofs.close();
    }
    CryptDestroyHash(hHash);
    CryptDestroyKey(hKey);
    CryptReleaseContext(hProv, 0);
///////////////////////////////////////////////////////////////////////////////////////////////////////
    if (!CryptAcquireContext(&hProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0))
    {
        std::cout << "Error\n";
        return 1;
    }
    if(!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash))
    {
        std::cout << "Error\n";
        CryptReleaseContext(hProv, 0);
        return 1;
    }
    if (!CryptHashData(hHash, (BYTE *)pass, strlen(pass), 0))
    {
        std::cout << "Error\n";
        CryptDestroyHash(hHash);
        CryptReleaseContext(hProv, 0);
        return 1;
    }
    if (!CryptDeriveKey(hProv, CALG_AES_192, hHash, CRYPT_EXPORTABLE, &hKey))
    {
        std::cout << "Error\n";
        CryptDestroyHash(hHash);
        CryptReleaseContext(hProv, 0);
        return 1;
    }
    ifs.open("data_enc.txt", std::ifstream::binary);
    ifs.seekg(0, ifs.end);
    len = ifs.tellg();
    ifs.seekg(0);
    data.resize(len + 10240);
    ifs.read(data.data(), len);
    ifs.close();
    datalen = len;
    if (!CryptDecrypt(hKey, NULL, true, 0, reinterpret_cast<BYTE *>(data.data()), &datalen))
    { 
        std::cout << "Error\n";
    }
    else
    {
        std::ofstream ofs("data_dec.txt", std::ifstream::binary);
        ofs.write(data.data(), datalen);
        ofs.close();
    }
    CryptDestroyHash(hHash);
    CryptDestroyKey(hKey);
    CryptReleaseContext(hProv, 0);
    //system("pause");
    return 0;
}
READ ALSO
Использование FLTK с VSCode

Использование FLTK с VSCode

Помогите с FLTK, которую используют в книге СтрауструпаСкачал FLTK, собрал с помощью make install

162
Работа с очередями и ООП (C++)

Работа с очередями и ООП (C++)

Дан текстовый файл с изображением целых чисел, которые необходимо переписать в очередь Qu1В очередь Qu2 сначала записать числа палиндромы,...

211
C++ Передача списка va_list в функцию

C++ Передача списка va_list в функцию

Подскажите, как реализовать функцию:

199
Холивар по поводу реализации. С++ и Qt

Холивар по поводу реализации. С++ и Qt

Есть объект A который владеет объектом B (объявляется и инициализируется в конструкторе объекта A и является членом объекта A)

204