Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > [BCB2009] CryptoAPI - Шифрование массива


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

# 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();
}

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

Автор: MuForum 24.1.2009, 22:53
# for all - Парни, мне нужна помощь =)

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

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

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

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

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

Автор: SenkraD 27.1.2009, 15:29
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

}


Автор: vikaz 27.1.2009, 19:06
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 

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

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

Из-за чего это?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)