Я пытаюсь 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
>>
для ввода.Это должно исправить ваши проблемы.
Редактировать:
// 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();
Вы уверены, что он печатает «// местоположение»? Я думаю, что это напечатало бы ‘// location’ — обратите внимание на пробел после двойной косой черты. Вы XORing 0x34 с 0x14. Результат 0x20, который является пробелом. Зачем вам все равно делать xor с 0x14?
** редактировать ** игнорировать вышесказанное; Я пропустил часть вашего вопроса. Реальный ответ:
Вы полностью уверены, что символ перед х является 0x20? Возможно, это какой-то непечатный персонаж, похожий на пробел? Я бы проверил шестнадцатеричное значение.