Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116

Не выходит xor шифрование

28.09.2014, 15:48. Показов 3127. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть вот такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string xorcrypt(const string& str, const string& key)
{
    string retval;
    retval.resize(str.length());
    for (int i = 0; i < str.length(); i++)
        retval[i] = str[i] ^ key[i % key.length()];
    return retval;
}
 
void main()
{
    string str = xorcrypt("teststring", "testkey");
    str = xorcrypt(str, "testkey");
}
он не работает при первом прогоне "string str = xorcrypt("teststring", "testkey");" в str оказывается пустая строка, при втором прогоне "str = xorcrypt(str, "testkey");" в str оказывается "teststring" помогите что не так...

Добавлено через 4 минуты
з.ы. взял алгоритм отсюда http://habrahabr.ru/post/183462/
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.09.2014, 15:48
Ответы с готовыми решениями:

XOR шифрование
Прошу написать мне алгоритм расшифровки проксоренного сообщения. Мне известно что длина ключа 3 символа, это латинские буквы нижнего...

XOR шифрование
Здравствуйте. Не хотел создавать ещё тему, но у меня не все гладко прошло с XOR шифрованием, не смотря на то, что там все просто. Не пойму...

Шифрование xor
Пишу шифрование методом xor. На вход поступает строка, каждый символ строки преобразуется в соответствующий ASCII-код. Получаем вектор...

29
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 15:58
Цитата Сообщение от GetHelp Посмотреть сообщение
при втором прогоне "str = xorcrypt(str, "testkey");"
Это как бы подтверждает, что алгоритм работает. Что не так?

Добавлено через 6 минут
Тонкий намек: 42 ^ 42 = 0
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
28.09.2014, 16:02
Сложность в том, что зашифрованная строка может содержать число ноль,
которое строку завершает. Поэтому длину строки надо хранить отдельно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 void xorcrypt(const int L,const char* str, const char* key,char* result)
{
    for (int i = 0; i < L; i++)
        result[i]= (str[i] ^ key[i % strlen(key)]);
}
int main()
{
    char result[100],str[]="teststring",str2[100];
    int L=strlen(str);
    xorcrypt(L,str, "testkey",result);
    xorcrypt(L,result, "testkey",str2);
    for(int i=0;i<L;i++)
        cout<<str2[i];
    cout<<endl;
    system("pause");
    return 0;
}
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 16:05
zss, ну уходить от std::string все-таки нужды нет. Посимвольный вывод - да, можно. Но выводить коды символов.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
28.09.2014, 16:08  [ТС]
zss, сорь, но что за гавнокод? зачем как последнему ламеру возиться с массивами символов? признаться раньше когда я начинал с чистого си я с ними столько навозился что меня от них уже тошнит... я был счастлив когда открыл для себя плюсы со string, vector и прочими контейнерами...

вот такой код не работает (ничего не выводит):
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
class record
{
public:
    string site;
    string nick;
    string email;
    string login;
    string pass;
    string info;
 
    string key;
 
    string xorcrypt(const string& str, const string& key)
    {
        string retval;
        retval.resize(str.length());
        for (int i = 0; i < str.length(); i++)
            retval[i] = str[i] ^ key[i % key.length()];
        return retval;
    }
 
    void crypt()
    {
        site = xorcrypt(site, key);
        nick = xorcrypt(nick, key);
        email = xorcrypt(email, key);
        login = xorcrypt(login, key);
        pass = xorcrypt(pass, key);
        info = xorcrypt(info, key);
    }
 
    bool SaveToFile(ofstream& stream)
    {
        crypt();
        stream << "|" << site
               << "|" << nick
               << "|" << email
               << "|" << login
               << "|" << pass
               << "|" << info
               << "|" << endl;
        return true;
    }
 
    bool LoadFromFile(ifstream& stream)
    {
        string str;
        getline(stream, str);
        sscanf(str.c_str(), "|%s|%s|%s|%s|%s|%s|", site.data(), 
                                                   nick.data(), 
                                                   email.data(), 
                                                   login.data(), 
                                                   pass.data(), 
                                                   info.data());
        crypt();
        return true;
    }
};
 
const char mainkey[] = "R}?j~6bR+(LAL0\m2S8jc8>bx~6YGIgW0cRGZz6tm.p.N9/<Vy";
 
int main()
{
    record rec;
    rec.key = mainkey;
    
    /*rec.site = "google.ru";
    rec.nick = "tester";
    rec.email = "test@gmail.com";
    rec.login = "tester";
    rec.pass = "1234";
    rec.info = "google accaunt";
    ofstream stream("test.txt");
    rec.SaveToFile(stream);*/
 
    ifstream stream("test.txt");
    rec.LoadFromFile(stream);
    cout << "site="  << rec.site  << endl
         << "nick="  << rec.nick  << endl
         << "email=" << rec.email << endl
         << "login=" << rec.login << endl
         << "pass="  << rec.pass  << endl
         << "info="  << rec.info  << endl;
 
    return cin.get();
}
з.ы. предварительно конечно была вызвана закоменченная часть, т.е. файл есть и в нем блокнотом видно эту строку...
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
28.09.2014, 16:11
Цитата Сообщение от 0x10 Посмотреть сообщение
Но выводить коды символов
Тут такой случай, что неизвестно, какие коды получатся.
Имеет смысл перестраховаться.

А в отношении string - ничего от нее не остается.
Если уж пользоваться то vector<unsigned char>
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 16:14
GetHelp, код собирается с кучей предупреждений - нужно все пофиксить для начала. И лучше выкладывать в полностью компилируемом состоянии, а то приходится добавлять инклуды, using namespace...
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
28.09.2014, 16:15  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
GetHelp, код собирается с кучей предупреждений - нужно все пофиксить для начала. И лучше выкладывать в полностью компилируемом состоянии, а то приходится добавлять инклуды, using namespace...
я предупреждения по умолчанию держу отключенными они меня только раздражают
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 16:16
Цитата Сообщение от zss Посмотреть сообщение
А тут такой случай, что неизвестно, какие коды получатся.
Имеет смысл перестраховаться.
А от чего перестраховываемся? Char в int поместится. Разница только в том, что код символа вывести можно, а символы не всегда отображаются.

Добавлено через 30 секунд
Цитата Сообщение от GetHelp Посмотреть сообщение
я предупреждения по умолчанию держу отключенными они меня только раздражают
И поэтому у тебя в коде запись по указателю на константу.
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
28.09.2014, 16:17
Цитата Сообщение от 0x10 Посмотреть сообщение
а символы не всегда отображаются.
И может в любом месте получиться ноль, который завершит строку!!
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 16:33
zss, я либо что-то недоформулировал, либо сам чего-то не понял. Я говорю о вот таком варианте:
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
#include <string>
#include <iostream>
 
std::string xorcrypt(const std::string& str, const std::string& key)
{
    std::string retval;
    retval.resize(str.length());
    for (size_t i = 0; i < str.length(); i++)
        retval[i] = str[i] ^ key[i % key.length()];
    return retval;
}
 
int main()
{
    std::string str = xorcrypt("teststring", "testkey");
    
    std::cout << "<<< ";
    for (const auto& ch : str)
    {
        std::cout << static_cast<int>(ch) << " ";
    }
    std::cout << std::endl;
    
    str = xorcrypt(str, "testkey");
    std::cout << ">>> " << str << std::endl;
}
Вывод:
C++
1
2
<<< 0 0 0 0 24 17 11 29 11 20 
>>> teststring
Добавлено через 11 минут
GetHelp, вообще тут помимо записи в константу изначально подход некорректный. Пишешь в файл бинарные данные, при этом используешь текстовый разделитель. Нет никакой гарантии, что после операции XOR какой-нибудь символ не станет этим же разделителем, и тогда прочитать данные будет невозможно. Если пишем бинарный файл, то и формат надо выбирать подходящий. Простейшее - Type-length-value
1
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
28.09.2014, 16:34
Прошу пардону. Меня смутило то, что в отладчике я увидел пустую строку str.
Поэтому подумал, что остальная часть потерялась.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
28.09.2014, 17:20  [ТС]
0x10, а как в плюсах с бинарниками работать??? я знаю только как с текстовыми...
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 17:27
Цитата Сообщение от GetHelp Посмотреть сообщение
а как в плюсах с бинарниками работать???
См методы std::istream::read, std::ostream::write.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
28.09.2014, 18:13  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
См методы std::istream::read, std::ostream::write.
а если не текст записывать как?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 18:16
Цитата Сообщение от GetHelp Посмотреть сообщение
а если не текст записывать как?
Взять адрес, скастовать к const char*, записать.

И да - что есть "не текст"?
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
28.09.2014, 18:17  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Взять адрес, скастовать к const char*, записать.
эт как?
Цитата Сообщение от 0x10 Посмотреть сообщение
И да - что есть "не текст"?
ну например число...
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 18:19
Цитата Сообщение от GetHelp Посмотреть сообщение
ну например число...
Копипастю свой пост из соседней темы:
C++
1
2
3
4
5
6
7
8
#include <fstream>
 
int main() {
    int answer = 42;
    std::ofstream out("out.txt");
    out.write(reinterpret_cast<const char*>(&answer), sizeof(answer));
    out.close();
}
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
28.09.2014, 18:30  [ТС]
0x10, а читать как?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 18:32
Цитата Сообщение от GetHelp Посмотреть сообщение
а читать как?
Полностью аналогично, за исключением "write", "ofstream" и "const".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2014, 18:32
Помогаю со студенческими работами здесь

XOR шифрование
Задание:Написать программу на выбранном языке программирования, реализующую описанный выше алгоритм для шифрования содержимого текстового ...

Шифрование Xor'ом
Добрый день, уважаемые) тут такое дело, сел делать курсач и столкнулся с проблемой. Работа по шифрованию бинарными операциями и...

Шифрование текста. XOR
Помогите с шифрование текста...с числоми вроде получалось. Что значит эта ошибка и как ее испрвить?..) #include &lt;iostream&gt; ...

XOR шифрование/дешифрование
Всем привет. Пож-ста помогите написать программу, шифрующую/дешифрующую xor маску. 2 Примера : N1 из FF FF FF FF D2...

Шифрование XOR не работает с кириллицей
Проблема и никак не могу решить. Функция XOR возвращает при исходной строке &quot;съешь еще этих мягких мексиканских кактусов да выпей...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru