20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
1

Простое шифрование и дешифрование - объяснить принцип работы кода

21.04.2015, 14:42. Показов 2646. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа шифрует и дешифрует знакомое всем "Hello world".
Люди с добрыми сердцами, подскажите как это происходит
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
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    char Text[] = "Hello world";
 
    for (int i = 0; i <= 11; i++)
    {
        char mask = (sin(3.14) * 400) - (cos(3.14) * 250 / 20);
        Text[i] = (Text[i] ^ mask);
    }
    for (int i = 0; i <= 11; i++)
        cout << Text[i];
    cout << endl;
    for (int i = 0; i <= 11; i++)
    {
        char mask = (sin(3.14) * 400) - (cos(3.14) * 250 / 20);
        Text[i] = (Text[i] ^ mask);
    }
    for (int i = 0; i <= 11; i++)
        cout << Text[i];
    cout << endl;
 
 
    system("pause");
    return 0;
}
Что получается после выполнения (sin(3.14) * 400) - (cos(3.14) * 250 / 20)?
Почему при шифровании совершается действие (Text[i] ^ mask); и при дешифровании совершается
оно же? (Text[i] ^ mask);
Своим скупым умишком я представлял, что если при шифровании используется сложение, то при дешифровании
надо использовать вычитание, умножение --- деление.
Надеюсь, у Вас хватит терпения объяснить мне.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2015, 14:42
Ответы с готовыми решениями:

Объяснить принцип работы списка
struct link { int data; link* next; };...

(dynamic_cast) Восходящее приведение типа.(объяснить принцип работы)
Вот восходящее приведение типа: class B { }; class C : public B { }; class D : public C { };...

не понимаю принцип работы кода
Привет ! Помогите понять суть работы кода пожалуйста. for(i=1;i&lt;=10;sum+=i++); Как работает...

Принцип работы кода: указатели, выделение памяти
Объясните мне что делает этот код: p = new int ; И вот этот, пожалуйста: struct...

14
Эксперт С++
3070 / 1408 / 425
Регистрация: 19.01.2009
Сообщений: 3,861
21.04.2015, 15:22 2
Цитата Сообщение от gogaloh Посмотреть сообщение
Своим скупым умишком я представлял, что если при шифровании используется сложение, то при дешифровании
надо использовать вычитание, умножение --- деление.
gogaloh, здесь для шифрования используется обычный XOR.
0
24 / 24 / 11
Регистрация: 09.04.2015
Сообщений: 80
21.04.2015, 15:36 3
Все довольно просто - операция XOR при однократном применении дает измененное число, при повторном применении с тем же аргументом - возвращает исходное значение. Это выражение с синусами - и есть "ключ" шифрования, т.е. оно должно быть одинаковым при шифровке и дешифровке. Правда это выражение представляет собой постоянное число, для большей сложности шифрования это выражение должно зависеть от i.
0
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
21.04.2015, 20:44  [ТС] 4
Вывел отдельной командой
C++
1
cout<<"mask="<< (sin(3.14) * 400) - (cos(3.14) * 250 / 20);
В консоле появилось : mask=13.137
Каким образом из первой буквы -H- и "ключа" 13.137 появилась зашифрованная буква -E-?
0
lss
940 / 868 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
21.04.2015, 21:08 5
Лучший ответ Сообщение было отмечено gogaloh как решение

Решение

Цитата Сообщение от gogaloh Посмотреть сообщение
Вывел отдельной командой
Выводить так нужно:
C++
1
2
char mask = (sin(3.14) * 400) - (cos(3.14) * 250 / 20);
cout << mask << endl;
Цитата Сообщение от gogaloh Посмотреть сообщение
Каким образом из первой буквы -H- и "ключа" 13.137 появилась зашифрованная буква -E-?
Код H - 48(hex) или 0100 1000, 13 - в бинарном виде это 0000 1101.
0100 1000
^
0000 1101
_________
0100 0101 - 45(hex) - код E.
0
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
21.04.2015, 21:18  [ТС] 6
lss, спаси тебя Бог.

Добавлено через 6 минут
lss, у Вас доброе сердце, не могу этим не воспользоваться,
что это за выражение (sin(3.14) * 400) - (cos(3.14) * 250 / 20)?
Почему не просто 13?
Чему равен sin(3.14)?
0
Модератор
Эксперт по электронике
8845 / 6625 / 902
Регистрация: 14.02.2011
Сообщений: 23,319
21.04.2015, 21:20 7
Цитата Сообщение от gogaloh Посмотреть сообщение
char mask = (sin(3.14) * 400) - (cos(3.14) * 250 / 20);
запутывание
разберем по частям
sin(3.14) синус Пи =0
cos(3.14) косинус Пи =-1
подставляем
mask = (0 * 400) - (-1 * 250 / 20)=250/20=12
можно сразу написать
C++
1
char mask = 12;
и ничего не изменится
0
lss
940 / 868 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
21.04.2015, 21:34 8
Цитата Сообщение от lss Посмотреть сообщение
Выводить так нужно:
Соврал немного. Если код в char не имеет графического отображения, то ничего не выведет, поэтому нужно так:
C++
1
2
char mask = (sin(3.14) * 400) - (cos(3.14) * 250 / 20);
cout << (int)mask << endl; // выведет 13
Добавлено через 6 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
можно сразу написать
C++
1
char mask = 12;
Ошибка в расчётах.
0
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
21.04.2015, 21:37  [ТС] 9
ValeryS, Эту строку char mask = (sin(3.14) * 400) - (cos(3.14) * 250 / 20); видит только компилятор и автор программы, запутать можно только компилятор или автор сам себя. Похоже кому-то это удалось
компилятор посчитал и выдал число 13.137.
0
lss
940 / 868 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
21.04.2015, 21:51 10
Цитата Сообщение от gogaloh Посмотреть сообщение
компилятор посчитал и выдал число 13.137.
char - это целое однобайтовое число, поэтому, при неявном приведении double к char, дробная часть будет отброшена и в mask будет 13.
0
Модератор
Эксперт по электронике
8845 / 6625 / 902
Регистрация: 14.02.2011
Сообщений: 23,319
21.04.2015, 21:52 11
Цитата Сообщение от lss Посмотреть сообщение
Ошибка в расчётах.
Цитата Сообщение от gogaloh Посмотреть сообщение
компилятор посчитал и выдал число 13.137.
никакой ошибки
просто человек который писал программу знает число Пи до второго знака
в результате sin(3.14)=0,00159265291648695254054143632444, похоже на 0?
умножим на 400 получаем 0,6370611665947810162165745297773
cos(3.14)=-0,99999873172753954528511430634505, похоже на -1 ?
умножаем на 250 и делим на 20 и прибавляем первое получаем -13,137045313189025332280503359013
ошибки округления чем так славятся числа с плавающей точкой
на другой машине может быть и другой результат
Цитата Сообщение от gogaloh Посмотреть сообщение
Эту строку char mask = (sin(3.14) * 400) - (cos(3.14) * 250 / 20); видит только компилятор и автор программы, запутать можно только компилятор или автор сам себя.
а также тот кто будет дизасемблировать программу
это еще мелочи, бывает целый день мурыжишь какую нибудь функцию, расчеты посложней чем здесь, и в результате получаешь что она всегда возвращает 1
в программировании есть специальный термин, который означает запутывание программы,Обфускация
https://ru.wikipedia.org/wiki/Обфускация
0
lss
940 / 868 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
21.04.2015, 21:57 12
Цитата Сообщение от ValeryS Посмотреть сообщение
просто человек который писал программу знает число Пи до второго знака
Не обязательно, просто3.14 - это не Пи. В этом и есть ошибка в твоих расчётах.
0
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
21.04.2015, 22:05  [ТС] 13
Спасибо Вам, люди добрые, надеюсь не я один узнал для себя что-то новое, что-то "разложил по полочкам".
Сожалею, что не могу поделится с Вами своими знаниями, из-за полного отсутствия таковых.
0
Модератор
Эксперт по электронике
8845 / 6625 / 902
Регистрация: 14.02.2011
Сообщений: 23,319
21.04.2015, 22:08 14
Цитата Сообщение от lss Посмотреть сообщение
Не обязательно, просто 3.14 - это не Пи.
объясни тогда сакральный смысл этой записи
думаешь специально сидел и подсчитывал на калькуляторе, чтобы зашифровать 13?
а по моему мнению хотел зашифровать 12 а получилось 13, хотя конечно это у автора нужно спрашивать
вот такая запись
C++
1
char mask = (char)(sin(3.14) * 400) -(char) (cos(3.14) * 250 / 20);
опять даст 12, и так, по моему, правильно , чтобы нивелировать ошибки округления
0
lss
940 / 868 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
21.04.2015, 23:39 15
Цитата Сообщение от ValeryS Посмотреть сообщение
объясни тогда сакральный смысл этой записи
...
Цитата Сообщение от ValeryS Посмотреть сообщение
хотя конечно это у автора нужно спрашивать
Для работы этого кода, как я понимаю, разницы никакой нет - 12 или 13, главное - что бы что-то одно. Чем зашифровал, тем и расшифровал. С этой точки зрения, тут всё правильно сделано.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2015, 23:39
Помогаю со студенческими работами здесь

Объяснить алгоритм работы указанного кода
Помогите понять алгоритм этого кода Объясните с комментарием кода или со словами...

Объясните принцип работы части кода для вывода элементов контейнера
Вот, собственно говоря, сам код для вывода элементов контейнера: struct print { char sep;...

Считывание структуры из файла: объяснить нюансы работы кода
есть функция, которая должна из файла считывать значения полей элементов массива структур и...

Подскажите, как сократить время работы кода? Проверка на простое число
#include &lt;iostream&gt; using namespace std; int main() { int x, k = 0; cin &gt;&gt; x; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru