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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифрование текста - XOR 
V
    Опции темы
NevzorovRuslan
Дата 25.7.2011, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#include "stdafx.h"

#include <iostream>
#include <conio.h>

#define endl "\n"

int main()
{
    char text[127];

    std::cout << "input text:" << endl;
    std::cin >> text;

    for ( int i = 0; i < sizeof(text); i++ )
    {
        text[i] = text[i] ^ i;
    }

    std::cout << "Encoded: " << text << endl;

    for ( int i = 0; i < sizeof(text); i++ )
    {
        text[i] = text[i] ^ i;
    }
    std::cout << "Decoded: " << text << endl;

    getch();

    return 0;
}


Интересует строка: 
Код

text[i] = text[i] ^ i;


Я читал про XOR, знаю что это исключающие ИЛИ, знаю что XOR позволяет узнать x и y с помощью z, но вот что я не понимаю..
Как он шифрует букву? Написано что XOR - битовая функция, он берет бит буквы? или что? кто-нибудь может подробно объяснить?
Очень хочется узнать, не первый раз сталкиваюсь, раньше забивал, но теперь хочется поднять занавес.

Добавлено через 1 минуту и 24 секунды
Заранее спасибо )

Добавлено через 6 минут и 41 секунду
Код

<?php
    $text = 'hello';
    
    for ( $i = 0; $i < strlen($text); $i++ )
    {
        $text[$i] = chr(ord($text[$i]) ^ $i);
    }
    
    echo $text;
    
    for ( $i = 0; $i < strlen($text); $i++ )
    {
        $text[$i] = chr(ord($text[$i]) ^ $i);
    }
    
    echo $text;


Так, вроде становится понятнее, C++ сам берет ASCII код символа? А дальше как работает проверка? ASCII ^ int? Объясните?

Добавлено через 7 минут и 51 секунду
Жду ответов =)
PM MAIL   Вверх
borisbn
Дата 25.7.2011, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(NevzorovRuslan @  25.7.2011,  01:07 Найти цитируемый пост)
Написано что XOR - битовая функция, он берет бит буквы?

Буква - это то, что выводится на экран. Компьютеры оперируют исключительно числами (битами). То, что хранится в char'е на самом деле - код символа (или буквы, как угодно). При выводе на экран код 0x20 интерпретируется как пробел, 0x41 - как 'A' и т.д. Так что операция XOR числа с числом - это нормально. В Вашем случе кода символа (чем не число) с числом i.
Цитата
text[i] = text[i] ^ i;

вот эту строчку можно переписать так
Код

int code_of_symbol = text[ i ];
code_of_symbol = code_of_symbol ^ i;
text[i] = code_of_symbol;


А вот таблица истинности операции XOR
Цитата

  |  0  1
--+-------
0 |  0  1
1 |  1  0

или так
Цитата

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

Таким образом верно равенство
Цитата

если
Z = X ^ Y;
то
X = Z ^ X;
X = Z ^ Y;

можешь проверить smile

Операция X ^ Y в Си делает побитовый XOR обоих операндов, т.е. берёт 0-й бит X, XOR'ит его с 0-м битом Y и кладёт в 0-й бит результата, затем берёт 1-й бит X, XOR'ит его с 1-м битом Y и кладёт в 1-й бит результата и т.д.

Возмём символ 'A' (код 0x41 или 01000001 в двоичном виже) и проXORим его с числом 42 (00101010)
Цитата

      01000001
xor
      00101010
-----------------
      01101011

получилось 0x5B. Попробуй сам сделать 0x5B ^ 42

Это сообщение отредактировал(а) borisbn - 25.7.2011, 01:31


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NevzorovRuslan
Дата 25.7.2011, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код:
Код

<?php
    $text = 'hello';
    
    for ( $i = 0; $i < strlen($text); $i++ )
    {
        var_dump(ord($text[$i]));
        
        echo "<br />" . ord($text[$i]) . " ^ " . $i . "<br />";
        
        var_dump(ord($text[$i]) ^ $i);
        var_dump(chr(ord($text[$i]) ^ $i));
        
        echo "<br />";
        
        $text[$i] = chr(ord($text[$i]) ^ $i);
    }
    
    echo "<br />";
    
    for ( $i = 0; $i < strlen($text); $i++ )
    {
        var_dump(ord($text[$i]));
        
        echo "<br />" . ord($text[$i]) . " ^ " . $i . "<br />";
        
        var_dump(ord($text[$i]) ^ $i);
        var_dump(chr(ord($text[$i]) ^ $i));
        
        echo "<br />";
        
        $text[$i] = chr(ord($text[$i]) ^ $i);
    }


Результат:
Код

int(104) 
104 ^ 0
int(104) string(1) "h" 
int(101) 
101 ^ 1
int(100) string(1) "d" 
int(108) 
108 ^ 2
int(110) string(1) "n" 
int(108) 
108 ^ 3
int(111) string(1) "o" 
int(111) 
111 ^ 4
int(107) string(1) "k" 

int(104) 
104 ^ 0
int(104) string(1) "h" 
int(100) 
100 ^ 1
int(101) string(1) "e" 
int(110) 
110 ^ 2
int(108) string(1) "l" 
int(111) 
111 ^ 3
int(108) string(1) "l" 
int(107) 
107 ^ 4
int(111) string(1) "o"


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

Добавлено через 2 минуты и 23 секунды
Всееее, огромное спасибо, теперь я понял!! =))
Просто сначало не увидел отредактированое сообщение smile)
Спасибо!!!
PM MAIL   Вверх
volatile
Дата 25.7.2011, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(NevzorovRuslan @  25.7.2011,  01:07 Найти цитируемый пост)
text[i] = text[i] ^ i;

Такие конструкции в С/С++ лучше записывать так:
Код

text[i] ^= i;

Во первых короче в записи.
Во вторых адрес text[i] вычисляется только один раз. т.е быстрее.
PM MAIL   Вверх
borisbn
Дата 25.7.2011, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(NevzorovRuslan @  25.7.2011,  01:33 Найти цитируемый пост)
кроме Таблицы истинности, не могу понять как она работает

XOR ещё по другому называют "сложение по модулю 2", если речь идёт о XOR'е одного бита.
Его (XOR) можно представить как
Цитата
X ^ Y = ( X + Y ) % 2

где X, Y - одиночные биты,
^ - XOR
+ - сложение (обычное)
% - остаток от деления

Цитата(NevzorovRuslan @  25.7.2011,  01:33 Найти цитируемый пост)
изучаю полученный результат выше..

Я не знаю, можно ли это сделать в пхп, но гораздо удобнее и нагляднее будет, если ты будешь выводить все числа (и коды символов и i и результат XOR-a) в двоичном виде (0-ки и 1-ки)

Добавлено @ 01:42
Цитата(volatile @  25.7.2011,  01:41 Найти цитируемый пост)
Такие конструкции в С/С++ лучше записывать так:

а за такие:
Цитата(NevzorovRuslan @  25.7.2011,  01:07 Найти цитируемый пост)
#define endl "\n"

руки отрывать smile

Это сообщение отредактировал(а) borisbn - 25.7.2011, 01:43


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NevzorovRuslan
Дата 25.7.2011, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(borisbn @ 25.7.2011,  01:41)
Цитата(NevzorovRuslan @  25.7.2011,  01:33 Найти цитируемый пост)
кроме Таблицы истинности, не могу понять как она работает

XOR ещё по другому называют "сложение по модулю 2", если речь идёт о XOR'е одного бита.
Его (XOR) можно представить как
Цитата
X ^ Y = ( X + Y ) % 2

где X, Y - одиночные биты,
^ - XOR
+ - сложение (обычное)
% - остаток от деления

Цитата(NevzorovRuslan @  25.7.2011,  01:33 Найти цитируемый пост)
изучаю полученный результат выше..

Я не знаю, можно ли это сделать в пхп, но гораздо удобнее и нагляднее будет, если ты будешь выводить все числа (и коды символов и i и результат XOR-a) в двоичном виде (0-ки и 1-ки)

Добавлено @ 01:42
Цитата(volatile @  25.7.2011,  01:41 Найти цитируемый пост)
Такие конструкции в С/С++ лучше записывать так:

а за такие:
Цитата(NevzorovRuslan @  25.7.2011,  01:07 Найти цитируемый пост)
#define endl "\n"

руки отрывать smile

я в данный момент делаю XOR на листочке =)

Десятичная:
10 XOR 7

Двоичная:
1010 XOR 111

1010
 111
====
 101

Что делать с первой 1 у 1010? Ее же не с чем XOR'ить!?
PM MAIL   Вверх
volatile
Дата 25.7.2011, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(NevzorovRuslan @  25.7.2011,  01:46 Найти цитируемый пост)
1010
 111
====
 101

Что делать с первой 1 у 1010? Ее же не с чем XOR'ить!? 

Нужно дописать незначащие нули
Код

1010
0111
====
1101


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


Новичок



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

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



volatile, спасибо, буду знать!
borisbn, раньше у меня endl работал без #define, в этот раз выдал ошибку, пришлось #define'ить.. В чем может быть проблема?
PM MAIL   Вверх
volatile
Дата 25.7.2011, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(NevzorovRuslan @  25.7.2011,  02:03 Найти цитируемый пост)
В чем может быть проблема? 

std::endl
PM MAIL   Вверх
NevzorovRuslan
Дата 25.7.2011, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(volatile @ 25.7.2011,  02:07)
Цитата(NevzorovRuslan @  25.7.2011,  02:03 Найти цитируемый пост)
В чем может быть проблема? 

std::endl

оу, щит, спасибо!
PM MAIL   Вверх
asmdzen
Дата 25.7.2011, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



Цитата(volatile @  25.7.2011,  01:41 Найти цитируемый пост)
Такие конструкции в С/С++ лучше записывать так:
text[i] ^= i;

есть какая-нибудь вероятность что компилятор превратит это в что-то подобное:
Код

mov edx, text
mov eax, i
add edx, eax
xor [edx], eax

т.е. будет делать xor сразу на памяти а не в регистрах? (просто я ему не доверяю и делаю это сам)
вообще есть какой-нибудь готовый вариант функции типа memmove которая делала бы xor при этом выбирая делать это обычными регистрами или mmx/sse?


Цитата(borisbn @  25.7.2011,  01:41 Найти цитируемый пост)
Цитата
X ^ Y = ( X + Y ) % 2

разве любая цифра % 2 не выдаст 1 или 0?


Цитата(volatile @  25.7.2011,  01:52 Найти цитируемый пост)

1010
0111
====
1101

это не очень похоже на 1 ) не догоняю с модулем.


Это сообщение отредактировал(а) asmdzen - 25.7.2011, 07:50
PM MAIL   Вверх
borisbn
Дата 25.7.2011, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(asmdzen @  25.7.2011,  07:42 Найти цитируемый пост)
разве любая цифра % 2 не выдаст 1 или 0?

Цитата(borisbn @  25.7.2011,  01:41 Найти цитируемый пост)
где X, Y - одиночные биты,

X в данном примере либо 0 либо 1, а не число (как, впрочем и Y и результат)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
asmdzen
Дата 25.7.2011, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



borisbn, понял, спасибо
PM MAIL   Вверх
volatile
Дата 25.7.2011, 12:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(asmdzen @  25.7.2011,  07:42 Найти цитируемый пост)
есть какая-нибудь вероятность что компилятор превратит это в что-то подобное:
mov edx, text
mov eax, i
add edx, eax
xor [edx], eax


Не стоит заморачиватсья на таких вещах, доверяйте компилятору.
Студия, по крайней мере, сделала все правильно, практически идеально:

Код

.text:00401553 loc_401553:                             ; CODE XREF: _main+29j
.text:00401553                 xor     [eax+ecx], al
.text:00401556                 inc     eax
.text:00401557                 cmp     eax, edx
.text:00401559                 jl      short loc_401553


исходник С
Код

    for ( int i = 0; i < len; i++ )
    {
        text[i] ^= i;
    }


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



**


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

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



volatile, это вполне устраивает )
я думал он там как всегда замудрит что-то свое, видел код где xor выполняется не очень красиво.

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

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

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

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

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


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

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


 




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


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

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