c ++ XOR字符串键十六进制

时间:2012-12-01 01:44:56

标签: c++ cryptography 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

2 个答案:

答案 0 :(得分:1)

  1. 摆脱所有演员。
  2. 请勿使用>>作为输入。
  3. 这应该可以解决你的问题。

    编辑:

    // 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 :(得分:0)

你确定它正在打印'//位置'吗?我认为它会打印'// location' - 注意双斜杠后面的空格。你正在与0x14 XORing 0x34。结果是0x20,这是一个空格字符。你为什么要用0x14来解决所有问题呢?

**编辑**忽略上述内容;我错过了你的部分问题。真正的答案:

你完全确定x之前的字符是0x20吗?也许它是一些看似空间的不可打印的角色?我会检查十六进制值。