Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифрование файла (file encryption/encoding) 
:(
    Опции темы
Yogurt
Дата 22.10.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть файл txt, в котором лежит полезная информация для обработки данных с помощью написанной программы.
Как закодировать или зашифровать файл, чтобы пользователь не мог его посмотреть, а если и смог бы, то ничего бы в нём не понял.
Файл объёмом 150 КБ, у файла есть повторяющаяся каждую строчку структура (короче там лежит много параметров с множеством настроек для каждого: 1 строка - 1 параметр)
Поставил настройку SetFileAttributes(FileName, FILE_ATTRIBUTE_HIDDEN); но это мало помогает
Что ещё можно сделать и есть ли функция установки пароля на файл

P.S. В основном прогаю в MFC, но в данном случае на код это оказывает посредственное влияние
PM MAIL   Вверх
EvilsInterrupt
Дата 22.10.2010, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Yogurt, задачи :
1) определить от кого скрываемся
2) определить как шустро должны выполняться шифрование\расшифровка
3) определить как раскрывать информацию при работе? Частями или можно целиком?

PM MAIL WWW ICQ Jabber   Вверх
Yogurt
Дата 25.10.2010, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1) Скрываем информацию от пользователей
2) Должно открываться шустро. Размер файла будет максимум около 200 Кб, поэтому обычно помещается в оперативную память. Думаю, небольшие преобразования перед этим не повлияют на скорость работы машины
3) Раскрывать целиком

Я подумал, что можно не сам файл шифровать, а его содержимое. Типа брать каждый байт и менять его левую и правую части

Наверное, многие уже сталкивались с этим. Как решили задачу? С какими проблемы обнаружились?
PM MAIL   Вверх
baldina
Дата 25.10.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата

В основном прогаю в MFC, но в данном случае на код это оказывает посредственное влияние 

поэт...  smile 

Цитата

можно не сам файл шифровать, а его содержимое

э-э... дайте определение, что есть 'сам файл', а что - 'его содержимое'

Цитата

Наверное, многие уже сталкивались с этим. Как решили задачу?

Для начала нужно определить требуемую криптостойкость. Если от пионэров закрываться, можно начать с простейшей подстановки в стиле пляшущих человечков. типа A->B, B->C и т.д.
тут

PM MAIL   Вверх
Yogurt
Дата 1.11.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



По-поводу "сам файл, или его содержимое" - файл можно открыть стандартными средствами Винды. Мне интересно, можно ли программно заблокировать файл от Ворда, Экселя и, если получится, блокнота?

По-поводу пляшущих человечков - надеялся, что кто-то уже с этим сталкивался, и расскажет, какие шишки набил. В основном интересует скорость работы с файлом, так как в программе предусмотрено его редактирование.

На счёт содержимого - на файл можно смотреть, как на набор байт, а можно - как на набор символов. Как лучше для кодирования данных?
PM MAIL   Вверх
baldina
Дата 1.11.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата

 на файл можно смотреть, как на набор байт, а можно - как на набор символов

А что такое байт? А это - символ из алфавита (0..255). Так что для кодирования без разницы...

Цитата

кто-то уже с этим сталкивался

конечно. Вам ссылку дали, оттуда ноги растут на другие ссылки... С этим сталкивались столько, что написаны горы литературы.
А что касается простейшей реализации пляшущих человечков - это на 10 мин работы. Для начинающих - час.

Цитата

программно заблокировать файл от Ворда, Экселя и, если получится, блокнота

можно. хотя сложно и ненадежно (на всякий винт с резьбой найдется...)
шифруйте, и будет вам счастье.
простейший способ - сделайте в цикле для каждого символа/байта файла операцию кодирования:

Код

unsigned char key = 0xED; // замените по вкусу

for (all bytes in file as B)
  B ^= key;


раскодирование - той же самой операцией.
а пока юзеры будут ломать эту "защиту" изучайте литературу

PM MAIL   Вверх
xvr
Дата 2.11.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Yogurt @  1.11.2010,  14:04 Найти цитируемый пост)
По-поводу "сам файл, или его содержимое" - файл можно открыть стандартными средствами Винды. Мне интересно, можно ли программно заблокировать файл от Ворда, Экселя и, если получится, блокнота?
Это как? В смысле, что бы при попытке открыть файл Блокнотом, тот с грохотом падал и уносил с собой пол Винды?  smile 


PM MAIL   Вверх
Леопольд
Дата 2.11.2010, 12:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(baldina @  1.11.2010,  15:17 Найти цитируемый пост)
unsigned char key = 0xED; // замените по вкусу
Код
unsigned char key = rand();
 smile 


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Yogurt
Дата 2.11.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Решил вопрос следующим образом:
Создал кодирующий/декодирующий класс. При открытии файла или изменении его содержимого все символы (строками или по отдельности) "проходят" через этот класс. Причём символы шифруются одним, двумя или тримя символами
Это не очень шустро, но пару секунд пользователь потерпеть может

Спасибо всем, кто отписался.

Для baldina : Байт, это не символ, это 8 бит. Символ по значению в разных кодировках значит разное. Как вариант - думал над побитовым считыванием байта, и затем поменять местами первую и вторую половину байта
PM MAIL   Вверх
Master01
Дата 2.11.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Для baldina : Байт, это не символ, это 8 бит. Символ по значению в разных кодировках значит разное. Как вариант - думал над побитовым считыванием байта, и затем поменять местами первую и вторую половину байта


Я думаю, имелось ввиду, что алгоритмам шифрования, в принципе, по барабану. Они работают с битами, точнее с последовательностями некоторой длины, а уж во что те биты складываются их не интересует.

PM MAIL   Вверх
baldina
Дата 2.11.2010, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Yogurt, 
Цитата(Yogurt @  2.11.2010,  13:28 Найти цитируемый пост)
Для baldina : Байт, это не символ, это 8 бит. Символ по значению в разных кодировках значит разное. 

Байт
Алфавит

Добавлено через 10 минут и 39 секунд
Цитата(Yogurt @  2.11.2010,  13:28 Найти цитируемый пост)
Причём символы шифруются одним, двумя или тримя символами
Это не очень шустро, но пару секунд пользователь потерпеть может

С реализацией все понятно. А с конечной целью не очень. Какие угрозы вы предотвращаете? Какой ущерб хотите предотвратить?
тут почитайте
и тут
для начала...

а на "3" вопрос такой: какое отношение имеет фраза
Цитата

Символ по значению в разных кодировках значит разное

к шифрованию файла?
PM MAIL   Вверх
bass
Дата 6.11.2010, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

BOOL Kript(BYTE * Buffer,DWORD BufferLeght )
{
BYTE cript[0x1C] ={ //здесь ключ};
DWORD count2 =0x1c;//длина ключа
HCRYPTPROV hProv;
HCRYPTKEY hKey;
DWORD size = BufferLeght;
// Получение контекста криптопровайдера
if (!CryptAcquireContext(&hProv, NULL, NULL,PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
{return 0;}
if(!CryptImportKey(hProv, &cript[0], count2, 0, 0, &hKey))
{return 0;}
if (!CryptEncrypt(hKey, 0, true, 0, Buffer,&BufferLeght,size ))
{return 0;}
CryptReleaseContext(hProv,0);
return 1;
}
BOOL Deskript(BYTE * Buffer,DWORD BufferLeght )
{
BYTE cript[0x1C] ={};
DWORD count2 =0x1c;
HCRYPTPROV hProv;
HCRYPTKEY hKey;
//==================================расшифруем===================================
// Получение контекста криптопровайдера
if(!CryptAcquireContext(&hProv, NULL, NULL,PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
{return 0;}
if(!CryptImportKey(hProv,&cript[0], count2, 0, 0, &hKey))
{return 0;}
if(!CryptDecrypt(hKey, 0, true, 0, Buffer, &BufferLeght))
{return 0;}
CryptReleaseContext(hProv,0);
//============================================================================
return 1;
}


Зашифровал буфер расшифровал WinAPI А чтоб вордом нельзя было открыть CreateFile но только когда твое приложение запушено с флагом доступ в монопольном режиме.....
PM MAIL   Вверх
Yogurt
Дата 7.12.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Забил на шифрование из за путаницы при исправлении файла, и сделал маленькую прогу. Текст файла лежит в файле txt, Unicode. Меняю местами все символы (Unicode = DWORD). Так как меняются ещё и символы переноса и окончания строки \n и \r, то после преобразования становится всё совсем непонятно. Всё восстанавливается тем же кодом.

Код

void CryptDword()
{
    // TODO: Add your control notification handler code here
    CStdioFile OFile, IFile;
    int Type;
    #ifdef _UNICODE
        Type = CFile::typeBinary;
    #else
        CFile::typeText;
    #endif

    OFile.Open(L"300.txt", Type | CFile::modeRead);
    IFile.Open(L"I300_new.txt", Type | CFile::modeCreate | CFile::modeWrite);

    ULONGLONG ByteLength = OFile.GetLength(); // байт
    
    BYTE b1, b2;
    WORD w1, w2;

    int i = 0;
    for(; i < ByteLength/4; i++)
    {
        
        //OFile.Read(&b1, sizeof(BYTE));
        //OFile.Read(&b2, sizeof(BYTE));

        //IFile.Write(&b2, sizeof(BYTE));
        //IFile.Write(&b1, sizeof(BYTE));

        OFile.Read(&w1, sizeof(WORD));
        OFile.Read(&w2, sizeof(WORD));

        IFile.Write(&w2, sizeof(WORD));
        IFile.Write(&w1, sizeof(WORD));

    }
    if(ByteLength%4 == 2)
    {
        OFile.Read(&w1, sizeof(WORD));
        IFile.Write(&w1, sizeof(WORD));
    }
    OFile.Close();
    IFile.Close();
}

PM MAIL   Вверх
xvr
Дата 7.12.2010, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Yogurt @  7.12.2010,  11:12 Найти цитируемый пост)
Меняю местами все символы
Способ 'шифровки' взламывается наблюдением содержимого 'зашифрованного' файла в hex виде где то секунд за 5-10. 'Расшифровщик' пишется с нуля минут за 10.
Резюме - использовать в программе уровня выше 'Hello world!' категорически запрещается.


PM MAIL   Вверх
Yogurt
Дата 25.12.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прислушался к совету коллег, и попробовал зашифровать с помощью криптостойкого алгоритма, но в результате понял, что наиболее просто, это развернуть каждый байт (в моём случае - каждые 2 байта, тк Юником) в обратном направлении. Алгоритм получился симметричным (им зашифровываю и расшифровываю)
Собственно вот:
Код

// для h
...
    union 
    {
        WORD word_;//union_bit_reverse;
        struct
        {
            unsigned bit1:1;
            unsigned bit2:1;
            unsigned bit3:1;
            unsigned bit4:1;
            unsigned bit5:1;
            unsigned bit6:1;
            unsigned bit7:1;
            unsigned bit8:1;
            unsigned bit9:1;
            unsigned bit10:1;
            unsigned bit11:1;
            unsigned bit12:1;
            unsigned bit13:1;
            unsigned bit14:1;
            unsigned bit15:1;
            unsigned bit16:1;
        } bit;
    } WORD_UN_REVERSE, WORD_UN;
...

// для cpp
void Reverse()
{
    CStdioFile OFile, IFile;
    int Type;
    #ifdef _UNICODE
        Type = CFile::typeBinary;
    #else
        CFile::typeText;
    #endif

    OFile.Open(L"new.txt", Type | CFile::modeRead);
    IFile.Open(L"new1.txt", Type | CFile::modeCreate | CFile::modeWrite);

    ULONGLONG ByteLength = OFile.GetLength(); // байт
    
    BYTE b1, b2;
    WORD w1, w2;

    int i = 0;
    for(int j = 0; i < ByteLength/2; i++, j = j + 2)
    {
        OFile.Read(&w1, sizeof(WORD));

        int value = w1;
        WORD_UN.word_ = w1;

        WORD_UN_REVERSE.bit.bit1 = WORD_UN.bit.bit16;
        WORD_UN_REVERSE.bit.bit2 = WORD_UN.bit.bit15;
        WORD_UN_REVERSE.bit.bit3 = WORD_UN.bit.bit14;
        WORD_UN_REVERSE.bit.bit4 = WORD_UN.bit.bit13;
        WORD_UN_REVERSE.bit.bit5 = WORD_UN.bit.bit12;
        WORD_UN_REVERSE.bit.bit6 = WORD_UN.bit.bit11;
        WORD_UN_REVERSE.bit.bit7 = WORD_UN.bit.bit10;
        WORD_UN_REVERSE.bit.bit8 = WORD_UN.bit.bit9;
        WORD_UN_REVERSE.bit.bit9 = WORD_UN.bit.bit8;
        WORD_UN_REVERSE.bit.bit10 = WORD_UN.bit.bit7;
        WORD_UN_REVERSE.bit.bit11 = WORD_UN.bit.bit6;
        WORD_UN_REVERSE.bit.bit12 = WORD_UN.bit.bit5;
        WORD_UN_REVERSE.bit.bit13 = WORD_UN.bit.bit4;
        WORD_UN_REVERSE.bit.bit14 = WORD_UN.bit.bit3;
        WORD_UN_REVERSE.bit.bit15 = WORD_UN.bit.bit2;
        WORD_UN_REVERSE.bit.bit16 = WORD_UN.bit.bit1;

        IFile.Write(&WORD_UN_REVERSE.word_, sizeof(WORD));
    }

    if(ByteLength%2)
    {
        OFile.Read(&b1, sizeof(BYTE));
        IFile.Write(&b1, sizeof(BYTE));
    }
    
    OFile.Close();
    IFile.Close();
}


P.S. Делаю, как я уже писал, в МФК, но переделать по fopen() и тп не составит труда
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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