Не работает XOR

144
16 февраля 2018, 19:23

Второй день пытаюсь сделать шифрование Xor'ом, но все никак не получается. Вот мой код. Что у меня не так?

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main()
{
SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

int key;
char text[100];
string res;
cout << "Введите текст: " << endl; // ввожу текст
cin >> text;
cout << "Введите ключ: " << endl;
cin >> key; // ввожу ключ

for (int i = 0; i < strlen(text); i++) { // подгоняю размер
    res[i] = text[i] ^ key; //само шифрование
}
cout << "Зашифрованный текст: " << res << endl;
return 0;
}
Answer 1

Как уже сказали, у тебя строка res нулевой длины, т.е. строка есть, а память под симполы не выделено. Прежде чем обратиться в i_тому символу, надо чтоб этот символ был. Т.е. надо проинициализировать строку res, например, так:

....
char text[100];
cout << "Введите текст: " << endl; // ввожу текст
cin >> text;
string res(test);
...

Теперь у тебя строка res эта полная копия text. Но тут правильно заметили, если тебе не нужно хранить оригинальную строку, то можешь прямое ее и модифицировать вот так:

...
for (int i = 0; i < strlen(text); i++) { // подгоняю размер
    text[i] = text[i] ^ key; //само шифрование
}
cout << "Зашифрованный текст: " << text << endl;
...

Но и тут есть подводные камни. Если ты введешь ключ который совпадает с ASCII кодом символа из строки, то после операции XOR на месте это символа окажется \0, что является признаком конца троки. Тогда std::cout распечатает зашифрованную строку только до этого символа и у тебя будет навсегда потерям оригинальный размер строки.

Answer 2
std::string key;
std::string str;
std::cout << "Введите текст: " << std::endl;
std::getline(std::cin, str); // вводим текст. Память выделяется автоматически
std::cout << "Введите ключ: " << std::endl;
std::getline(std::cin, key);  // вводим ключ
int keyIdx = 0;  // текущий индекс байта ключа
for (int i = 0; i < str.size(); i++) {
  str[i] = str[i] ^ key[keyIdx++]; // шифруем строку и смещаем индекс ключа
  if (keyIdx == key.size())  // если достигли конца ключа - начинаем сначала
    keyIdx = 0;
}
std::cout << "Зашифрованный текст: " << str << std::endl;

Тип std::string может содержать \0 внутри строки

READ ALSO
Показывает Мусор при запуске

Показывает Мусор при запуске

Ваши условия не покрывают случай, когда i или j равно n, а стало быть в ячейках с этими индексами остаются неинициализированные данныеПросто...

198
Можно ли QLineEdit сделать многострочным?

Можно ли QLineEdit сделать многострочным?

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

139
QscriptEngine Qt/C++ парсинг строки

QscriptEngine Qt/C++ парсинг строки

Помогите исправить код надо вместо 3 * 3 * 3 чтобы было сразу 3^3

228
Доступ к экземпляру класса в статичной функции

Доступ к экземпляру класса в статичной функции

Столкнулся с проблемойНужно вставить в таблицу, в луа C-функцию, которая должна обращаться к НЕ статичному полу (экземпляру класса)

154