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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XOR кеширование, не могу найти ошибку (нехватка знаний) 
:(
    Опции темы
MrImho
Дата 3.8.2010, 21:01 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте уважаемые форумчане. Хочу закодировать файл XOR методом, собственно вот код, в чем ошибка?
Код

FILE *f=_wfopen(L"1.txt", L"rt,ccs=UNICODE");
FILE *f2=_wfopen(L"2.txt", L"w+,ccs=UNICODE");
wchar_t *pass=L"123";
wchar_t a;
int i=0;
a=getwc(f);
    if(f)
    {
        while(!feof(f))
        {
        if(i==3)i=0;
        putwc(a^pass[i],f2);
        a=getwc(f);
        i++;
        }
    fclose(f);
    fclose(f2);
    }
FILE *f3=_wfopen(L"2.txt", L"rt,ccs=UNICODE");
FILE *f4=_wfopen(L"3.txt", L"w+,ccs=UNICODE");
i=0;
a=getwc(f3);
    if(f3)
    {
        while(!feof(f3))
        {
        if(i==3)i=0;
        putwc(a^pass[i],f4);
        a=getwc(f3);
        i++;
        }
    fclose(f3);
    fclose(f4);
    }

Есть файл с текстом, в начале его шифрую и записываю во 2 файл, затем открываю его и расшифрую и записываю в 3, но текст 1 и 3 файлов не совпадают, а вот почему не знаю.
Буду благодарен, если кто мне поможет.
PM MAIL   Вверх
MrImho
Дата 4.8.2010, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте помогите пожалуйста с возникшей проблемой, описаной в этом топике:
http://forum.vingrad.ru/forum/topic-306911...y2192412/0.html
Сделал копию в этом разделе, потому, что в предыдущем не получил ответа.
PM MAIL   Вверх
cutwater
Дата 4.8.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Делать было нечего накидал готовый вариант.

Код

#include <stdio.h>

int main()
{
    char pass[] = "password";
    size_t pass_len = sizeof(pass) - 1;

    // xor encryption
    FILE* e_in = fopen("plain.txt", "rb");
    FILE* e_out = fopen("encrypted.txt", "wb");

    int i;
    for( i = 0; !feof(e_in); ++i )
    {
        char ch = 0;
        if( !fread(&ch, 1, 1, e_in) )
            break;
        ch ^= pass[ i % pass_len ];
        fwrite(&ch, 1, 1, e_out );
    }

    fclose( e_in );
    fclose( e_out );

    // xor decryption
    FILE* d_in = fopen("encrypted.txt", "rb");
    FILE* d_out = fopen("decrypted.txt", "wb");

    for( i = 0; !feof(d_in); ++i )
    {
        char ch = 0;
        if( !fread(&ch, 1, 1, d_in) )
            break;
        ch ^= pass[ i % pass_len ];
        fwrite(&ch, 1, 1, d_out );
    }

    fclose( d_in );
    fclose( d_out );
}


Теперь замечания:
Вы новичек, но Вы должны знать значения слов которые произносите. Это к кешированию не имеет абсолютно никакого отношения. Называется шифрование.
Непонятно, зачем Вы использовали wchar_t ? Учите матчасть.
Написал код согласно Вашему, естественно читать файлы по одному символу плохо, но думаю так Вам будет проще понять и разобраться.
Научитесь пользоваться отладчиком и на небольших примерах отладочным выводом.
Научитесь сами решать свои проблемы.
И еще раз учите матчасть.


--------------------
user posted image
PM MAIL   Вверх
cutwater
Дата 4.8.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ответил в Вашей новой теме.


--------------------
user posted image
PM MAIL   Вверх
bsa
Дата 4.8.2010, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MrImho @  4.8.2010,  08:04 Найти цитируемый пост)
Сделал копию в этом разделе, потому, что в предыдущем не получил ответа. 
Цитата(cutwater @  4.8.2010,  11:30 Найти цитируемый пост)
Это к кешированию не имеет абсолютно никакого отношения. Называется шифрование.
Поэтому нечего ожидать ответа, когда вопрос задал некорректно.

Это сообщение отредактировал(а) bsa - 4.8.2010, 10:37
PM   Вверх
MrImho
Дата 4.8.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В том, то и дело, что с char я уже написал код и он работает на ура, но мне нужен UNICODE, поэтому с wchar_t, но почему-то не работает. Хотя алгоритм вроде тот-же. С char то как раз таки все просто, а вот UNICOD замучал!

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


Опытный
**


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

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



Цитата(MrImho @  4.8.2010,  12:19 Найти цитируемый пост)
В том, то и дело, что с char я уже написал код и он работает на ура, но мне нужен UNICODE, поэтому с wchar_t, но почему-то не работает. Хотя алгоритм вроде тот-же. С char то как раз таки все просто, а вот UNICOD замучал!


Стоп а каким концом юникод к двоичным данным. Объясните может быть зачем вам нужен юникод?
Я абсолютно уверен что в данном случае юникод Вам не нужен.

Это сообщение отредактировал(а) cutwater - 4.8.2010, 13:59


--------------------
user posted image
PM MAIL   Вверх
MrImho
Дата 4.8.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если бы был не нужен, я бы обошелся, а так........ Ладно походу надо ещё помучатся, ладно в топку тему, толку от неё.

Это сообщение отредактировал(а) MrImho - 4.8.2010, 15:53
PM MAIL   Вверх
cutwater
Дата 4.8.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MrImho @  4.8.2010,  14:53 Найти цитируемый пост)
Если бы был не нужен, я бы обошелся, а так........ Ладно походу надо ещё помучатся, ладно в топку тему, толку от неё.


Вы все таки попытайтесь объяснить? Мне кажется, что Вы очень сильно не понимаете что делаете, поэтому вдруг возникает юникод... там где ему совсем не место.


--------------------
user posted image
PM MAIL   Вверх
djamshud
Дата 4.8.2010, 16:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



MrImho, ксор-шифрованию совершенно пофиг, как софт интерпретирует данные - как utf-8, utf-16 или даже cp1251.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
cutwater
Дата 4.8.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
user posted image
PM MAIL   Вверх
MrImho
Дата 4.8.2010, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да Вы правы оно работает с любыми данными но мне нужны не char а wchar_t
в программе используется в wchar_t и только!!! а на выходе при расшифровке я получу char, тогда другой вопрос, как все это дело перевести в wchar_t? Я получу при расшифроке массив char[...] и что мне с ним делать? как я воспользуюсь русским шрифтом? Зачем мне нужно решение, результатом которого я не смогу воспользоваться. Ещё раз повторяю. Есть (предварительно мною закодированый) файл, программа должна его раскодировать и с этим массивом уже работать (парсить, создавать древо данных и т.д.). А в этоге при раскодировке получается char и как мне его в wchar_t перевести? И ещё при кодировании файла он сохраниться в другой кодировке, а когда программа откроет его в UNICODE, ох представляю как "белиберда" получится. 
Вы сами попробуйте. У меня "белиберда".

Добавлено через 7 минут и 3 секунды
Щас попробую перевести данные из char в wchar_t через union если все получится отпишусь
В любом случае спасибо за все ваши ответы.
PM MAIL   Вверх
bsa
Дата 4.8.2010, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



MrImho, ты про преобразование типов ничего не слышал?
Код
char *buffer;
...
wchar_t *utext = (wchar_t*)buffer;

PM   Вверх
cutwater
Дата 4.8.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bsa @  4.8.2010,  17:04 Найти цитируемый пост)
MrImho, ты про преобразование типов ничего не слышал?


По-моему это будет вряд ли работать.


MrImho, Вы не с той стороны подходите к проблеме. У Вас есть двоичные данные на входе, двоичные данные на выходе. Вам нужно банально не XOR-шифрование реализовать через wchar_t а просто из полученного результата char* получить wchar_t* . Эта задача решается элементарно, без костылей.
Собственно вот один из моих старых примеров, разберитесь в нем. И у Вам только остается сложить два решения вместе.
http://dumpz.org/16714/

Добавлено через 13 минут и 14 секунд
Цитата(MrImho @  4.8.2010,  16:57 Найти цитируемый пост)
И ещё при кодировании файла он сохраниться в другой кодировке, а когда программа откроет его в UNICODE, ох представляю как "белиберда" получится. 


Да и еще постарайтесь разобраться с теорией кодировок. При кодировании файла у вас на выходе будут двоичные данные. Вы их конечно можете представить в любой кодировке, только смысла эта операция не имеет. Ибо на данном этапе вам необходимо оперировать двоичными данными.
Фактически у вас получается цепочка:

1) строка wchar_t -> 2) двоичные данные -> 3) шифрование -> 4) двоичные данные -> 5) дешифрование -> 6) двоичные данные -> 7) текст wchar_t

кодировка важна лишь на этапах 1-2 и 6-7 то есть от юникода к данным в определенной кодировке и обратно.

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

Добавлено через 13 минут и 40 секунд
bsa, может быть я где-то заблуждаюсь. поправьте если что не так.


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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