将XOR实现为无法按预期工作的宏

时间:2018-08-07 08:09:14

标签: c macros xor

我有一个输入字符串为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

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

2 个答案:

答案 0 :(得分:6)

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

输入和键的第一个字符为'a'

'a' ^ 'a' ==> 0

,因此循环仅迭代一次。您必须使用先前设置的变量来打印加密的字符串。

像在成功的示例中一样,计算循环外的字符串长度。

答案 1 :(得分:0)

我知道了((解密时)),在lstrlenA()loop中使用loop并没有什么区别,因为:

因为我从文件中读取了缓冲区,并且缓冲区中可能存在0个字符,所以当我在lstrlenA()中或其他任何地方使用macro时,会给我错误的大小(概率为{{1 }}在缓冲区中),因此我应该在{{1}中将buffer-size直接用作0的值(指示当我使用lpNumberOfBytesRead函数从文件读取时读取了多少字节) }为此,我添加了ReadFile()参数。

我的macro缓冲区中也存在此问题。

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

data

所以我用key是这样的:

#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()。因此,我使用了0的直接缓冲区大小和我的密钥作为直接文件大小。