
Опытный
 
Профиль
Группа: Участник
Сообщений: 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(); }
|
- Проблема в том, что шифровака и дешифровка происходит не корректно, где накосячил собственно понять не могу =(
--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
|