Второй день пытаюсь сделать шифрование 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;
}
Как уже сказали, у тебя строка 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 распечатает зашифрованную строку только до этого символа и у тебя будет навсегда потерям оригинальный размер строки.
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 внутри строки
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости