将 XOR 作为宏实现,但未按预期工作
Implemented XOR as a macro not working as expected
我有一个输入字符串 CHAR cszReadBuffer[1000]
,XOR
操作应用于它,键为 CHAR cszReadKeyBuffer[10]
,实际上我读 key
和 buffer
来自包含以下内容的两个文件
关键文件内容:
abcd
输入文件内容:
aaaaaddddrrrttt
bbbbrfgergv
b
eeerwef
当我阅读 key
和 buffer
大小和内容时,它们绝对正确如下:
dwKeyFileLength(key length) is 4 byte
dwLastBitChunk(input-file length) is 40 byte
内容(cszReadBuffer
、cszReadKeyBuffer
)与以上文件中的内容相同。
现在,通过以下实施,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
所以循环只迭代一次。您必须使用先前设置的变量来打印加密字符串。
在循环外计算字符串长度,就像您在成功示例中所做的那样。
我明白了((在解密时)在loop
或loop
之外使用lstrlenA()
没有区别,因为:
因为我从文件中读取缓冲区并且缓冲区中可能存在 0
字符,所以当我在 macro
或任何地方使用 lstrlenA()
时,它给我错误的大小(概率是 0
in buffer), 所以我应该在我的 macro
我为此添加了 datasize
参数。
我的 key
缓冲区也存在这个问题。
因此它必须将 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()
,因为在buffer
中有可能是0
。所以我使用 lpNumberOfBytesRead
sa 直接缓冲区大小和我的密钥作为直接文件大小。
我有一个输入字符串 CHAR cszReadBuffer[1000]
,XOR
操作应用于它,键为 CHAR cszReadKeyBuffer[10]
,实际上我读 key
和 buffer
来自包含以下内容的两个文件
关键文件内容:
abcd
输入文件内容:
aaaaaddddrrrttt
bbbbrfgergv
b
eeerwef
当我阅读 key
和 buffer
大小和内容时,它们绝对正确如下:
dwKeyFileLength(key length) is 4 byte
dwLastBitChunk(input-file length) is 40 byte
内容(cszReadBuffer
、cszReadKeyBuffer
)与以上文件中的内容相同。
现在,通过以下实施,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
所以循环只迭代一次。您必须使用先前设置的变量来打印加密字符串。
在循环外计算字符串长度,就像您在成功示例中所做的那样。
我明白了((在解密时)在loop
或loop
之外使用lstrlenA()
没有区别,因为:
因为我从文件中读取缓冲区并且缓冲区中可能存在 0
字符,所以当我在 macro
或任何地方使用 lstrlenA()
时,它给我错误的大小(概率是 0
in buffer), 所以我应该在我的 macro
我为此添加了 datasize
参数。
我的 key
缓冲区也存在这个问题。
因此它必须将 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()
,因为在buffer
中有可能是0
。所以我使用 lpNumberOfBytesRead
sa 直接缓冲区大小和我的密钥作为直接文件大小。