Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [BCB2009] CryptoAPI - Шифрование массива, CryptoAPI - Отдельный класс для работы 
:(
    Опции темы
MuForum
  Дата 22.1.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 1
Всего: 4



Доброе время суток!
- Столкнулся со следующей проблемой, мне необходимо осуществить шифрование/дешифрование массива.
- Шифрование/Дешифрование файла происходит нормально, а вот с массивом возникают проблемы =(

# TCryptoAPI.cpp:
Код

#include <vcl.h>
#include "TCryptoAPI.h"
//---------------------------------------------------------------------------

TCryptoAPI::TCryptoAPI()
{
    InitCSP();
}
//---------------------------------------------------------------------------

TCryptoAPI::~TCryptoAPI()
{
    ReleaseCSP();
}
//---------------------------------------------------------------------------

void TCryptoAPI::InitCSP()
{
    if(!CryptAcquireContext(&g_hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
    {
        AnsiString err = "";
        // ----
        switch (GetLastError())
        {
            case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
            case ERROR_NOT_ENOUGH_MEMORY: err = "ERROR_NOT_ENOUGH_MEMORY"; break;
            case NTE_BAD_FLAGS: err = "NTE_BAD_FLAGS"; break;
            case NTE_BAD_KEYSET: err = "NTE_BAD_KEYSET"; break;
            case NTE_BAD_KEYSET_PARAM: err = "NTE_BAD_KEYSET_PARAM"; break;
            case NTE_BAD_PROV_TYPE: err = "NTE_BAD_PROV_TYPE"; break;
            case NTE_BAD_SIGNATURE: err = "NTE_BAD_SIGNATURE"; break;
            case NTE_EXISTS: err = "NTE_EXISTS"; break;
            case NTE_KEYSET_ENTRY_BAD: err = "NTE_KEYSET_ENTRY_BAD"; break;
            case NTE_KEYSET_NOT_DEF: err = "NTE_KEYSET_NOT_DEF"; break;
            case NTE_NO_MEMORY: err = "NTE_NO_MEMORY"; break;
            case NTE_PROV_DLL_NOT_FOUND: err = "NTE_PROV_DLL_NOT_FOUND"; break;
            case NTE_PROV_TYPE_ENTRY_BAD: err = "NTE_PROV_TYPE_ENTRY_BAD"; break;
            case NTE_PROV_TYPE_NO_MATCH: err = "NTE_PROV_TYPE_NO_MATCH"; break;
            case NTE_PROV_TYPE_NOT_DEF: err = "NTE_PROV_TYPE_NOT_DEF"; break;
            case NTE_PROVIDER_DLL_FAIL: err = "NTE_PROVIDER_DLL_FAIL"; break;
            case NTE_SIGNATURE_FILE_BAD: err = "NTE_SIGNATURE_FILE_BAD"; break;
            default: err = "Unknown error";
        }
        // ----
        MessageBox(NULL, strcat("Error of CryptAcquireContext: ", err.c_str()), "Error", MB_OK);
    }
}
//---------------------------------------------------------------------------

void TCryptoAPI::ReleaseCSP()
{
    CryptDestroyKey(g_key);
    // ----
    if(!CryptReleaseContext(g_hProv, 0))
    {
        AnsiString err = "";
        // ----
        switch (GetLastError())
        {
            case ERROR_BUSY: err = "ERROR_BUSY"; break;
            case ERROR_INVALID_HANDLE: err = "ERROR_INVALID_HANDLE"; break;
            case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
            case NTE_BAD_FLAGS: err = "NTE_BAD_FLAGS"; break;
            case NTE_BAD_UID: err = "NTE_BAD_UID"; break;
            default: err = "Unknown error";
        }
        // ----
        MessageBox(NULL, strcat("Error of CryptReleaseContext: ", err.c_str()), "Error", MB_OK);
    }
}
//---------------------------------------------------------------------------

void TCryptoAPI::SetKey(AnsiString sKey)
{
    HCRYPTHASH hHash;
    AnsiString err = "";
    // ----
    if(!CryptCreateHash(g_hProv, CALG_SHA, 0, 0, &hHash))
    {
        switch (GetLastError())
        {
            case ERROR_INVALID_HANDLE: err = "ERROR_INVALID_HANDLE"; break;
            case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
            case ERROR_NOT_ENOUGH_MEMORY: err = "ERROR_NOT_ENOUGH_MEMORY"; break;
            case NTE_BAD_ALGID: err = "NTE_BAD_ALGID"; break;
            case NTE_BAD_FLAGS: err = "NTE_BAD_FLAGS"; break;
            case NTE_BAD_KEY: err = "NTE_BAD_KEY"; break;
            case NTE_NO_MEMORY: err = "NTE_NO_MEMORY"; break;
            default: err = "Unknown error";
        }
        // ----
        MessageBox(NULL, strcat("Error of CryptCreateHash: ", err.c_str()), "Error", MB_OK);
        return;
    }
    // ----
    if(!CryptHashData(hHash, &sKey[1], sKey.Length(), 0))
    {
        switch (GetLastError())
        {
            case ERROR_INVALID_HANDLE: err = "ERROR_INVALID_HANDLE"; break;
            case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
            case NTE_BAD_ALGID: err = "NTE_BAD_ALGID"; break;
            case NTE_BAD_FLAGS: err = "NTE_BAD_FLAGS"; break;
            case NTE_BAD_HASH: err = "NTE_BAD_HASH"; break;
            case NTE_BAD_HASH_STATE: err = "NTE_BAD_HASH_STATE"; break;
            case NTE_BAD_KEY: err = "NTE_BAD_KEY"; break;
            case NTE_BAD_LEN: err = "NTE_BAD_LEN"; break;
            case NTE_BAD_UID: err = "NTE_BAD_UID"; break;
            case NTE_FAIL: err = "NTE_FAIL"; break;
            case NTE_NO_MEMORY: err = "NTE_NO_MEMORY"; break;
            default: err = "Unknown error";
        }
        // ----
        MessageBox(NULL, strcat("Error of CryptHashData: ", err.c_str()), "Error", MB_OK);
        return;
    }
    // ----
    if(!CryptDeriveKey(g_hProv, CALG_RC4, hHash, 0, &g_key))
    {
        switch (GetLastError())
        {
            case ERROR_INVALID_HANDLE: err = "ERROR_INVALID_HANDLE"; break;
            case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
            case NTE_BAD_ALGID: err = "NTE_BAD_ALGID"; break;
            case NTE_BAD_FLAGS: err = "NTE_BAD_FLAGS"; break;
            case NTE_BAD_HASH: err = "NTE_BAD_HASH"; break;
            case NTE_BAD_HASH_STATE: err = "NTE_BAD_HASH_STATE"; break;
            case NTE_BAD_UID: err = "NTE_BAD_UID"; break;
            case NTE_FAIL: err = "NTE_FAIL"; break;
            default: err = "Unknown error";
        }
        // ----
        MessageBox(NULL, strcat("Error of CryptDeriveKey: ", err.c_str()), "Error", MB_OK);
        return;
    }
    // ----
    if(!CryptDestroyHash(hHash))
    {
        switch (GetLastError())
        {
            case ERROR_BUSY: err = "ERROR_BUSY"; break;
            case ERROR_INVALID_HANDLE: err ="ERROR_INVALID_HANDLE"; break;
            case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
            case NTE_BAD_ALGID: err = "NTE_BAD_ALGID"; break;
            case NTE_BAD_HASH: err = "NTE_BAD_HASH"; break;
            case NTE_BAD_UID: err = "NTE_BAD_UID"; break;
            default: err = "Unknown error";
        }
        // ----
        MessageBox(NULL, strcat("Error of CryptDestroyHash: ", err.c_str()), "Error", MB_OK);
        return;
    }
}
//---------------------------------------------------------------------------

void TCryptoAPI::EncryptData(const byte *in, byte *out, int inlen)
{
    AnsiString err;
    DWORD l=1;
    byte temp;
    int iFinal = 0;
    // ----
    for(int i=0; i<inlen; i++)
    {
        temp = in[i];
        if(i == inlen - 1) iFinal = inlen;
        // ----
        if(!CryptEncrypt(g_key, 0, iFinal, 0, &temp, &l, l))
        {
            switch (GetLastError())
            {
                case ERROR_INVALID_HANDLE: err = "ERROR_INVALID_HANDLE"; break;
                case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
                case NTE_BAD_ALGID: err = "NTE_BAD_ALGID"; break;
                case NTE_BAD_DATA: err = "NTE_BAD_DATA"; break;
                case NTE_BAD_FLAGS: err = "NTE_BAD_FLAGS"; break;
                case NTE_BAD_HASH: err = "NTE_BAD_HASH"; break;
                case NTE_BAD_HASH_STATE: err = "NTE_BAD_HASH_STATE"; break;
                case NTE_BAD_KEY: err = "NTE_BAD_KEY"; break;
                case NTE_BAD_LEN: err = "NTE_BAD_LEN"; break;
                case NTE_BAD_UID: err = "NTE_BAD_UID"; break;
                case NTE_DOUBLE_ENCRYPT: err = "NTE_DOUBLE_ENCRYPT"; break;
                case NTE_FAIL: err = "NTE_FAIL"; break;
                case NTE_NO_MEMORY: err = "NTE_NO_MEMORY"; break;
                default: err = "Unknown error";
            }
            // ----
            MessageBox(NULL, strcat("Error of CryptEncrypt: ", err.c_str()), "Error", MB_OK);
            return;
        }
        // ----
        out[i] = temp;
    }
}
//---------------------------------------------------------------------------

void TCryptoAPI::DecryptData(const byte *in, byte *out, int inlen)
{
    AnsiString err;
    DWORD l=1;
    byte temp;
    int iFinal = 0;
    // ----
    for(int i=0; i<inlen; i++)
    {
        temp = in[i];
        if(i == inlen - 1) iFinal = inlen;
        // ----
        if(!CryptDecrypt(g_key, 0, iFinal, 0, &temp, &l))
        {
            switch (GetLastError())
            {
                case ERROR_INVALID_HANDLE: err = "ERROR_INVALID_HANDLE"; break;
                case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
                case NTE_BAD_ALGID: err = "NTE_BAD_ALGID"; break;
                case NTE_BAD_DATA: err = "NTE_BAD_DATA"; break;
                case NTE_BAD_FLAGS: err = "NTE_BAD_FLAGS"; break;
                case NTE_BAD_HASH: err = "NTE_BAD_HASH"; break;
                case NTE_BAD_HASH_STATE: err = "NTE_BAD_HASH_STATE"; break;
                case NTE_BAD_KEY: err = "NTE_BAD_KEY"; break;
                case NTE_BAD_LEN: err = "NTE_BAD_LEN"; break;
                case NTE_BAD_UID: err = "NTE_BAD_UID"; break;
                case NTE_DOUBLE_ENCRYPT: err = "NTE_DOUBLE_ENCRYPT"; break;
                case NTE_FAIL: err = "NTE_FAIL"; break;
                case NTE_NO_MEMORY: err = "NTE_NO_MEMORY"; break;
                default: err = "Unknown error";
            }
            // ----
            MessageBox(NULL, strcat("Error of CryptDecrypt: ", err.c_str()), "Error", MB_OK);
            return;
        }
        // ----
        out[i] = temp;
    }
}
//---------------------------------------------------------------------------

void TCryptoAPI::EncryptData()
{
    AnsiString err;
    DWORD l=1;
    char data, temp;
    FILE *file_in, *file_out;
    // ----
    AnsiString plaintext = "et_in.txt";
    AnsiString ciphertext = "et_out.txt";
    // ----
    file_in  = fopen(plaintext.c_str(), "rb");
    file_out = fopen(ciphertext.c_str(), "wb+");
    fseek(file_in, 0, 0);
    // ----
    for(temp = fgetc(file_in); !feof(file_in); )
    {
        data = temp;
        temp = fgetc(file_in);
        // ----
        if(!CryptEncrypt(g_key, 0, feof(file_in), 0, &data, &l, l))
        {
            switch (GetLastError())
            {
                case ERROR_INVALID_HANDLE: err = "ERROR_INVALID_HANDLE"; break;
                case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
                case NTE_BAD_ALGID: err = "NTE_BAD_ALGID"; break;
                case NTE_BAD_DATA: err = "NTE_BAD_DATA"; break;
                case NTE_BAD_FLAGS: err = "NTE_BAD_FLAGS"; break;
                case NTE_BAD_HASH: err = "NTE_BAD_HASH"; break;
                case NTE_BAD_HASH_STATE: err = "NTE_BAD_HASH_STATE"; break;
                case NTE_BAD_KEY: err = "NTE_BAD_KEY"; break;
                case NTE_BAD_LEN: err = "NTE_BAD_LEN"; break;
                case NTE_BAD_UID: err = "NTE_BAD_UID"; break;
                case NTE_DOUBLE_ENCRYPT: err = "NTE_DOUBLE_ENCRYPT"; break;
                case NTE_FAIL: err = "NTE_FAIL"; break;
                case NTE_NO_MEMORY: err = "NTE_NO_MEMORY"; break;
                default: err = "Unknown error";
            }
            // ----
            MessageBox(NULL, strcat("Error of CryptEncrypt: ", err.c_str()), "Error", MB_OK);
            return;
        }
        // ----
        fputc(data, file_out);
    }
    // ----
    fclose(file_in);
    fclose(file_out);
}
//---------------------------------------------------------------------------

void TCryptoAPI::DecryptData()
{
    AnsiString err;
    DWORD l=1;
    char data, temp;
    FILE *file_in, *file_out;
    // ----
    AnsiString plaintext = "et_dec.txt";
    AnsiString ciphertext = "et_out.txt";
    // ----
    file_in = fopen(ciphertext.c_str(), "rb");
    file_out = fopen(plaintext.c_str(), "wb+");
    fseek(file_in, 0, 0);
    // ----
    for(temp = fgetc(file_in); !feof(file_in); )
    {
        data = temp;
        temp = fgetc(file_in);
        // ----
        if(!CryptDecrypt(g_key, 0, feof(file_in), 0, &data, &l))
        {
            switch (GetLastError())
            {
                case ERROR_INVALID_HANDLE: err = "ERROR_INVALID_HANDLE"; break;
                case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
                case NTE_BAD_ALGID: err = "NTE_BAD_ALGID"; break;
                case NTE_BAD_DATA: err = "NTE_BAD_DATA"; break;
                case NTE_BAD_FLAGS: err = "NTE_BAD_FLAGS"; break;
                case NTE_BAD_HASH: err = "NTE_BAD_HASH"; break;
                case NTE_BAD_HASH_STATE: err = "NTE_BAD_HASH_STATE"; break;
                case NTE_BAD_KEY: err = "NTE_BAD_KEY"; break;
                case NTE_BAD_LEN: err = "NTE_BAD_LEN"; break;
                case NTE_BAD_UID: err = "NTE_BAD_UID"; break;
                case NTE_DOUBLE_ENCRYPT: err = "NTE_DOUBLE_ENCRYPT"; break;
                case NTE_FAIL: err = "NTE_FAIL"; break;
                case NTE_NO_MEMORY: err = "NTE_NO_MEMORY"; break;
                default: err = "Unknown error";
            }
            // ----
            MessageBox(NULL, strcat("Error of CryptDecrypt: ", err.c_str()), "Error", MB_OK);
            return;
        }
        // ----
        fputc(data, file_out);
    }
    // ----
    fclose(file_in);
    fclose(file_out);
}
//---------------------------------------------------------------------------



# TCryptoAPI.h:
Код

#include <windows.h>
#include <stdio.h>
//---------------------------------------------------------------------------

class TCryptoAPI
{
    private:
        HCRYPTPROV g_hProv;
        HCRYPTKEY g_key;
        // ----
        //void InitCSP();
        //void ReleaseCSP();
    public:
        TCryptoAPI();
        ~TCryptoAPI();
        // ----
        void InitCSP();
        void ReleaseCSP();
        // ----
        void SetKey(AnsiString sKey);
        void EncryptData(const byte *in, byte *out, int inlen);
        void DecryptData(const byte *in, byte *out, int inlen);
        void EncryptData();
        void DecryptData();
};
//---------------------------------------------------------------------------



# Вызов функций:
Код

void __fastcall TFFMain::b_startClick(TObject *Sender)
{
    TCryptoAPI cp;
    cp.SetKey("1234567890123456");
    // ----
    byte *in = "I wont go to school, but my need my helm... =))";
    byte *out = new byte[sizeof(in)];
    byte *dec = new byte[sizeof(in)];
    // ----
    cp.EncryptData(in, out, strlen(in)); // Шифрование массива.
    cp.EncryptData(); // Шифрование файла.
    // ----
    cp.DecryptData(out, dec, strlen(out)); // Дешифрование массива.
    cp.DecryptData(); // Дешифрование файла.
    // ----
    WLogE(AnsiString((char*)out));
    WLogD(AnsiString((char*)dec));
    // ----
    delete[] out;
    cp.~TCryptoAPI();
}

- Проблема в том, что шифровака и дешифровка происходит не корректно, где накосячил собственно понять не могу =(


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
MuForum
Дата 24.1.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 1
Всего: 4



# for all - Парни, мне нужна помощь =)

Обнаружилось, почему шифровка не правильно реализовывается, хоть я передаю и заполняю массивы, всё равно при записывание в массив byte значение '0x00' (Это воспринимается как конец строки)
- И дальше значения не записываются в массив. (Только 14 символов и ###) =(

Вот ключ: "1234567890123456" (16 байт - 128 бит)
Текст: "I wont go to school, but my need my helm... =))"
- на 14 символе функция шифрования возвращает значение 0x00, и при записывание в массив, затем все значения не воспринимаются =(
- Я читал о такой проблеме в теме про XOR шифрование, но там люди работали с AnsiString, а у меня тут массивы.
- Думал меня это не заденет, но видно ошибался =(


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
vikaz
Дата 26.1.2009, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Привет! Самое странное другое, файл то шифруется нормально..... ИЛИ нет?


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
vikaz
Дата 26.1.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Файл с такой строкой шифруется/расшифровывается нормально, значит эту проблему можно обойти


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
vikaz
Дата 27.1.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



странно, у меня постоянно выдает ошибку в памяти при шифровании файла. И еще, а ты не пробывал шифровать не посимвольно, а сразу всю строку?


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
SenkraD
Дата 27.1.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



MuForum, что это за чудеса?

Код

void __fastcall TFFMain::b_startClick(TObject *Sender)
{
    TCryptoAPI cp;
    cp.SetKey("1234567890123456");
    // ----
    byte *in = "I wont go to school, but my need my helm... =))";
    byte *out = new byte[sizeof(in)]; // точно нужен sizeof, а не strlen(in) + 1
    byte *dec = new byte[sizeof(in)]; // тоже что и выше
    // ----
    cp.EncryptData(in, out, strlen(in)); // Шифрование массива.
    cp.EncryptData(); // Шифрование файла.
    // ----
    cp.DecryptData(out, dec, strlen(out)); // Дешифрование массива.
    cp.DecryptData(); // Дешифрование файла.
    // ----
    WLogE(AnsiString((char*)out));
    WLogD(AnsiString((char*)dec));
    // ----
    delete[] out; // а где удаление out и dec
    cp.~TCryptoAPI(); // не помню чтобы по стандарту можно было открыто вызвать деструктор за исключением placement new

}




--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
vikaz
Дата 27.1.2009, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



MuForum, ох ну и натворил ты дел! Я переписал твои функции так:

Код

byte * TCryptoAPI::EncryptData(byte *in, int inlen)
{
    AnsiString err;
    DWORD l=inlen;
    int iFinal = 1;

        if(!CryptEncrypt(g_key, 0, iFinal, 0, in, &l, l))
        {
            switch (GetLastError())
            {
                case ERROR_INVALID_HANDLE: err = "ERROR_INVALID_HANDLE"; break;
                case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
                case NTE_BAD_ALGID: err = "NTE_BAD_ALGID"; break;
                case NTE_BAD_DATA: err = "NTE_BAD_DATA"; break;
                case NTE_BAD_FLAGS: err = "NTE_BAD_FLAGS"; break;
                case NTE_BAD_HASH: err = "NTE_BAD_HASH"; break;
                case NTE_BAD_HASH_STATE: err = "NTE_BAD_HASH_STATE"; break;
                case NTE_BAD_KEY: err = "NTE_BAD_KEY"; break;
                case NTE_BAD_LEN: err = "NTE_BAD_LEN"; break;
                case NTE_BAD_UID: err = "NTE_BAD_UID"; break;
                case NTE_DOUBLE_ENCRYPT: err = "NTE_DOUBLE_ENCRYPT"; break;
                case NTE_FAIL: err = "NTE_FAIL"; break;
                case NTE_NO_MEMORY: err = "NTE_NO_MEMORY"; break;
                default: err = "Unknown error";
            }
            // ----
            MessageBox(NULL, strcat("Error of CryptEncrypt: ", err.c_str()), "Error", MB_OK);

        }

 return in;
}


Код

byte * TCryptoAPI::DecryptData(byte *in,int inlen)
{
  AnsiString err;
  DWORD l=inlen;

    int iFinal = 1;

        if(!CryptDecrypt(g_key, 0, iFinal, 0, in, &l))
        {
            switch (GetLastError())
            {
                case ERROR_INVALID_HANDLE: err = "ERROR_INVALID_HANDLE"; break;
                case ERROR_INVALID_PARAMETER: err = "ERROR_INVALID_PARAMETER"; break;
                case NTE_BAD_ALGID: err = "NTE_BAD_ALGID"; break;
                case NTE_BAD_DATA: err = "NTE_BAD_DATA"; break;
                case NTE_BAD_FLAGS: err = "NTE_BAD_FLAGS"; break;
                case NTE_BAD_HASH: err = "NTE_BAD_HASH"; break;
                case NTE_BAD_HASH_STATE: err = "NTE_BAD_HASH_STATE"; break;
                case NTE_BAD_KEY: err = "NTE_BAD_KEY"; break;
                case NTE_BAD_LEN: err = "NTE_BAD_LEN"; break;
                case NTE_BAD_UID: err = "NTE_BAD_UID"; break;
                case NTE_DOUBLE_ENCRYPT: err = "NTE_DOUBLE_ENCRYPT"; break;
                case NTE_FAIL: err = "NTE_FAIL"; break;
                case NTE_NO_MEMORY: err = "NTE_NO_MEMORY"; break;
                default: err = "Unknown error";
            }
            // ----
            MessageBox(NULL, strcat("Error of CryptEncrypt: ", err.c_str()), "Error", MB_OK);

        }

 return in;
}


Код

TCryptoAPI cp;
    cp.SetKey("qwertyuiopasdfghasdfghjklbhgtf");
    // ----

    byte *in = "I wont go to school, but my need my helm... =))";

    byte *out = new byte[strlen(in)+1];
    byte *dec = new byte[strlen(in)+1];

    // ----
    strcpy (out,cp.EncryptData(in, strlen(in)+1));
    Memo1->Lines->Add((char*)out);

    strcpy (dec, cp.DecryptData(out, strlen(out)+1));
    Memo2->Lines->Add((char*)dec);

    delete[] out;
    delete[] dec;




Код

class TCryptoAPI
{
    private:
        HCRYPTPROV g_hProv;
        HCRYPTKEY g_key;
        // ----
        //void InitCSP();
        //void ReleaseCSP();
    public:
        TCryptoAPI();
        ~TCryptoAPI();
        // ----
        void InitCSP();
        void ReleaseCSP();
        // ----
        void SetKey(AnsiString sKey);
        char * EncryptData(char *in, int inlen);
        char * DecryptData(char *in, int inlen);
        void EncryptData();
        void DecryptData();
};


Когда я переписал функции, как мне казалось правильнее, у меня твоя строчка тоже не заработала, я долго сидел и думал, почему. А потом случайно, сделал ВЕЛИКОЕ ИЗМЕНЕНИЕ, СМЕНИЛ КЛЮЧ. И все стало работать как надо.  Вобщем, все работает. Проверяй и дерзай.......   smile 


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
MuForum
Дата 27.1.2009, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 1
Всего: 4



#7, vikaz - Ты прав, на удивление, всё работает без проблем(если поменять ключ).
- Не могу правда понять, с чем это связано....


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
BOB4uK
Дата 6.2.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 28.2.2004

Репутация: нет
Всего: нет



Всем привет!
Попробовал набросать программку для тестирования, но почему то срабатывает через раз!
Жму на кнопку первый раз - все нормально (шифр., дешифр.), жму второй или третий раз (когда как), либо вылетает сообщение сославшись на библиотеку BORLNDMM.DLL

Из-за чего это?
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0987 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.