将 XOR 作为宏实现,但未按预期工作

Implemented XOR as a macro not working as expected

我有一个输入字符串 CHAR cszReadBuffer[1000]XOR 操作应用于它,键为 CHAR cszReadKeyBuffer[10],实际上我读 keybuffer来自包含以下内容的两个文件

关键文件内容:

abcd

输入文件内容:

aaaaaddddrrrttt
bbbbrfgergv
b
eeerwef

当我阅读 keybuffer 大小和内容时,它们绝对正确如下:

dwKeyFileLength(key length) is 4 byte
dwLastBitChunk(input-file length) is 40 byte

内容(cszReadBuffercszReadKeyBuffer)与以上文件中的内容相同。

现在,通过以下实施,XOR 加密和解密工作正常:

for(int i = 0;i < dwLastBitChunk;i++)
    cszReadBuffer[i] = cszReadBuffer[i] ^ cszReadKeyBuffer[i % dwKeyFileLength];

加密输出:

̀Ԃ؀စᘑᘕ椗k؁ဃ̅ငሄ桬椁ݫĆᔓȆ

我还有另一个实现如下 macro :

#define   XOR(data, key) \
    LONG lKeySize = lstrlenA(key); \
    for(int i = 0;i < lstrlenA(data);i++) \
        data[i] = data[i] ^ key[i % lKeySize]; \

但是当我使用 macro 时:

XOR(cszReadBuffer, cszReadKeyBuffer)

(只是为了加密) 它给我以下输出:

 aaaaddddrrrttt
bbbbrfgergv
b
eeerwef

我想知道为什么会这样?有什么建议吗?

您在每个循环中计算 lstrlenA(data),但 data 正在变化。

输入的第一个字符和key是'a'所以

'a' ^ 'a' ==> 0

所以循环只迭代一次。您必须使用先前设置的变量来打印加密字符串。

在循环外计算字符串长度,就像您在成功示例中所做的那样。

我明白了((在解密时)在looploop之外使用lstrlenA()没有区别,因为:

因为我从文件中读取缓冲区并且缓冲区中可能存在 0 字符,所以当我在 macro 或任何地方使用 lstrlenA() 时,它给我错误的大小(概率是 0 in buffer), 所以我应该在我的 macro 我为此添加了 datasize 参数。

我的 key 缓冲区也存在这个问题。

因此它必须将 datakey 大小传递给宏,如下所示:

#define     XOR(data, dsize, key, keysize) \
    for(int i = 0;i < dsize;i++) \
        data[i] = data[i] ^ key[i % keysize]; \

所以我使用了 macro 比如:

XOR(cszReadBuffer, lpNumberOfBytesRead, cszReadKeyBuffer, dwKeyFileLength)

XOR()参数中,我不应该使用lstrlenA(),因为在buffer中有可能是0。所以我使用 lpNumberOfBytesRead sa 直接缓冲区大小和我的密钥作为直接文件大小。