Форум программистов, компьютерный форум CyberForum.ru

Шифрование файлов открытым ключем - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
20.10.2011, 02:07     Шифрование файлов открытым ключем #1
Доброго времени суток.
Вообщем необходимо шифровать файлы с данными (которые я же и записываю туда) опредиленным образом, а именно: симметричное шифрование (поблочное) в режиме электронной кодовой книги, с добавлением случайного значения, хэшировать через SHA.

Как я это делаю:
Класс для шифровки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
class Crypt
{
public:
     Crypt(const char *KeyPsw, ALG_ID HashAlg, ALG_ID CipherAlg, DWORD dwFlags, UINT CRYPT_MODE);
     ~Crypt();
     char *Encrypt(char *word, DWORD word_length); //зашифровать блок данных
     char *Decrypt(char *word, DWORD word_length); //расшифровать блок данных
private:
     HCRYPTPROV hProv; //криптографический провайдер
     HCRYPTKEY hSessionKey; //симметричный сеансовый ключ
};
 
#include "Crypt.h"
 
Crypt::Crypt(const char *KeyPsw, ALG_ID HashAlg, ALG_ID CipherAlg, DWORD dwFlags, UINT CRYPT_MODE)
{
     HCRYPTHASH hash=0;
 
     DWORD KeyPsw_length=0;
     while(KeyPsw[KeyPsw_length]!='\0')
          KeyPsw_length++;
     
     CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); //испл.стандартн. криптопровайдера
     CryptCreateHash(hProv, HashAlg, NULL, NULL, &hash); //создать хеш
     CryptHashData(hash, (BYTE*)KeyPsw, KeyPsw_length, NULL); //хешировать парольную фразу
 
     cout<<"hash="<<hash<<"\n";
 
     CryptDeriveKey(hProv, CipherAlg, hash, dwFlags, &hSessionKey); //создание ключа на основе хеша парольной фразы
     CryptSetKeyParam(hSessionKey, KP_MODE, (BYTE*)CRYPT_MODE, NULL); //установить режим шифрования
 
     cout<<"SessionKey="<<hSessionKey<<"\n";
 
     CryptDestroyHash(hash);
}
Crypt::~Crypt()
{
     CryptDestroyKey(hSessionKey);
     CryptReleaseContext(hProv, NULL);
}
char * Crypt::Encrypt(char *word, DWORD word_length)
{
     char *buffer=new char[word_length+1];
     for(int i=0;i<(int)word_length;i++)
          buffer[i]=word[i];
     buffer[word_length]='\0';
 
     CryptEncrypt(hSessionKey, 0, false, 0, (BYTE*)buffer, &word_length, word_length);
 
     return buffer;
}
char * Crypt::Decrypt(char *word, DWORD word_length)
{
     char *buffer=new char[word_length+1];
     for(int i=0;i<(int)word_length;i++)
          buffer[i]=word[i];
     buffer[word_length]='\0';
 
     CryptDecrypt(hSessionKey, 0, false, 0, (BYTE*)buffer, &word_length);
     
     return buffer;
}
Шифровка всего файла:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    if (!isDecrDataCreated())
        return;
    Crypt crypt("password", CALG_SHA, CALG_RC2, CRYPT_CREATE_SALT, CRYPT_MODE_ECB);
 
 
    char buf[CRYPT_BLOCK_SIZE]; //буффер для хранения блока данных
    unsigned short count=0;                //количество считанных байт
    ifstream fin("decrypted.uid", ios::binary);
    if (!fin)
    {
        MessageBox(0, L"Ошибка при открытии файла.", L"Ошибка", MB_OK | MB_ICONERROR);
        return;
    }
    ofstream fout("encrypted.uid", ios::binary);
    if (!fout)
    {
        MessageBox(0, L"Ошибка при открытии файла.", L"Ошибка", MB_OK | MB_ICONERROR);
        return;
    }
    while(!fin.eof())
    {
        count=fin.read(buf, CRYPT_BLOCK_SIZE).gcount();
        fout.write(crypt.Decrypt(buf,count), count);
        count=0;
    }
    fin.close();
    fout.close();
    /*char str[50];
    sprintf(str,"%d", GetLastError());
    MessageBox(0,str,"",0);*/
    remove("decrypted.uid");
    remove("DATA.uid");
    rename("encrypted.uid","DATA.uid");
Дешифровка файла:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDC_ACCEPT:
            {
                int length=SendMessage(edtKey, EM_GETLINE, NULL, (LPARAM)key);
                key[length]='\0';
                Crypt crypt("password", CALG_SHA, CALG_RC2, CRYPT_CREATE_SALT, CRYPT_MODE_ECB);
                
                char buf[CRYPT_BLOCK_SIZE];
                unsigned short count=0;
                ifstream fin("DATA.uid", ios::binary);
                if (!fin)
                {
                    MessageBox(hDlg, L"Ошибка при открытии файла.", L"Ошибка", MB_OK | MB_ICONERROR);
                    return false;
                }
                ofstream fout("decrypted.uid", ios::binary);
                if (!fout)
                {
                    MessageBox(hDlg, L"Ошибка при открытии файла.", L"Ошибка", MB_OK | MB_ICONERROR);
                    return false;
                }
                while(!fin.eof())
                {
                    count=fin.read(buf, CRYPT_BLOCK_SIZE).gcount();
                    fout.write(crypt.Decrypt(buf,count), count);
                    count=0;
                }
                fin.close();
                fout.close();
                /*char str[50];
                sprintf(str,"%d", GetLastError());
                MessageBox(0,str,"",0);*/
                /*ifstream file("decrypted.uid",ios::binary);
                if (!file)
                {
                    MessageBox(hDlg, "Ошибка при открытии файла.", "Ошибка", MB_OK | MB_ICONERROR);
                    return false;
                }
                users rhs; // временный пользователь для прогона цикла
                while(!file.eof())
                {
                     file.read((char*)&rhs,sizeof users);
                     if (rhs.getLogin()=="ADMIN")
                     {
                         remove("DATA.uid"); //удалить зашифрованный файл
                         file.close();
                         EndDialog(hDlg,0);
                     }
                }
                file.close();
                remove("decrypted.uid"); //удалить временный файл
                MessageBox(hDlg, "Неверно введен ключ шифрования", "Ошибка", MB_OK | MB_ICONERROR);
                DestroyWindow(applicationManager::app->getAppWindow()); */          
                EndDialog(hDlg,0);
                return true;
            }
Изначально, если открыть файл блокнотом то в нем видны какие-то данные, именно поэтому его и надо шифровать. После прогона шифровки и просмотре через блокнот видна просто какая-то каша, но при попытке дешифровки каша меняется, но файл становиться нечитабелен.

GetLastError ничего не выдает, тобишь проблема где-то в другом месте.

Пробовал менять VS2010 на 2008, менять мультибайтову кодировку на юникод, пробовал менять режими шифрование и парольное слово ("password"), ничего не помогает.

Есть идеи?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fort-_-minor
6 / 6 / 2
Регистрация: 30.07.2010
Сообщений: 87
20.10.2011, 03:40     Шифрование файлов открытым ключем #2
если вас правильно понял, это стеганография. попробуйте открыть файл не через блокнот а wordpad к примеру, позавчера лабу писал по етому материалу, проблема была именно в етом.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
20.10.2011, 05:23     Шифрование файлов открытым ключем #3
Spellz, Так шифрование с открытым ключем не симметричное поидее.....
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
20.10.2011, 08:48     Шифрование файлов открытым ключем #4
Цитата Сообщение от fort-_-minor Посмотреть сообщение
если вас правильно понял, это стеганография
Вы неправильно поняли. Это криптография.
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Так шифрование с открытым ключем не симметричное поидее.....
А где вы видели открытый ключ? Насколько я понял для самого шифрования используется простой RC2, который симметричен.

Автору на заметку: алгоритм RC2 является собственностью компании RSA Security Inc. и для его использования требуется лицензия.

Добавлено через 9 минут
Еще автору: а почему и при шифровании и при дешифровании используется .Decrypt?
C
1
fout.write(crypt.Decrypt(buf,count), count);
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
20.10.2011, 08:50     Шифрование файлов открытым ключем #5
mimicria, В заголовке темы )
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
20.10.2011, 08:54     Шифрование файлов открытым ключем #6
Цитата Сообщение от vitaly1981 Посмотреть сообщение
mimicria, В заголовке темы )
Подозреваю, что ТС не силён в ключевых определениях. Имелся в виду пароль в открытом виде.
Yandex
Объявления
20.10.2011, 08:54     Шифрование файлов открытым ключем
Ответ Создать тему
Опции темы

Текущее время: 19:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru