криптография — c ++ XOR строковый ключ hex

Я пытаюсь XOR некоторые уже зашифрованные файлы.
Я знаю, что ключ XOR равен 0x14 или dec (20).

Мой код работает за исключением одной вещи. Все 4 исчезли.

Вот моя функция для XOR:

void xor(string &nString)    // Time to undo what we did from above :D
{
const int KEY = 0x14;
int strLen = (nString.length());
char *cString = (char*)(nString.c_str());

for (int i = 0; i < strLen; i++)
{
*(cString+i) = (*(cString+i) ^ KEY);
}
}

Вот часть моей главной:

ifstream inFile;
inFile.open("ExpTable.bin");
if (!inFile) {
cout << "Unable to open file";
}

string data;

while (inFile >> data) {
xor(data);
cout << data << endl;
}

inFile.close();

Вот часть зашифрованного файла:

$y{bq      //0 move
%c|{       //1 who
&c|qfq     //2 where
'saufp     //3 guard
x{wu`}{z  //4 location

Но x{wu} {z` возвращает // местоположение. Его не отображается 4.
Обратите внимание на пространство перед X. которое должно быть декодировано до 4.

Что мне не хватает? Почему он не показывает все 4? <space> = 4 // 4 = <space>


ОБНОВИТЬ

Это список всех конкретных конверсий:

HEX(enc) ASCII(dec)
20       4
21       5
22       6
23       7
24       0
25       1
26       2
27       3
28       <
29       =
2a       >
2b       ?
2c       8
2d       9
2e       :
2f       ;
30       $
31       %
32       &
33       '
34
35       !
36       "37       #
38       ,
39       -
3a       .
3b       /
3c       (
3d       )
3e       *
3f       +
40       T
41       U
42       V
43       W
44       P
45       Q
46       R
47       S
48       \
49       ]
4a       ^
4b       _
4c       X
4d       Y
4e       Z
4f       [
50       D
51       E
52       F
53       G
54       @
55       A
56       B
57       C
58       L
59       M
5a       N
5b       O
5c       H
5d       I
5e       J
5f       K
60       t
61       u
62       v
63       w
64       p
65       q
66       r
67       s
68       |
69       }
6a
6b
6c       x
6d       y
6e       z
6f       {
70       d
71       e
72       f
73       g

75       a
76       b
77       c
78       l
79       m
7a       n
7b       o
7c       h
7d       i
7e       j
7f       k
1d       /tab
1e       /newline

0

Решение

  1. Избавиться от всех слепков.
  2. Не использовать >> для ввода.

Это должно исправить ваши проблемы.

Редактировать:

// got bored, wrote some (untested) code
ifstream inFile;
inFile.open("ExpTable.bin", in | binary);
if (!inFile) {
cerr << "Unable to open ExpTable.bin: " << strerror(errno) << "\n";
exit(EXIT_FAILURE);
}

char c;
while (inFile.get(c)) {
cout.put(c ^ '\x14');
}

inFile.close();
1

Другие решения

Вы уверены, что он печатает «// местоположение»? Я думаю, что это напечатало бы ‘// location’ — обратите внимание на пробел после двойной косой черты. Вы XORing 0x34 с 0x14. Результат 0x20, который является пробелом. Зачем вам все равно делать xor с 0x14?

** редактировать ** игнорировать вышесказанное; Я пропустил часть вашего вопроса. Реальный ответ:

Вы полностью уверены, что символ перед х является 0x20? Возможно, это какой-то непечатный персонаж, похожий на пробел? Я бы проверил шестнадцатеричное значение.

0

По вопросам рекламы [email protected]