我有一个输入字符串为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
我想知道为什么会这样吗?有什么建议吗?
答案 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
缓冲区中也存在此问题。
因此,它必须将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()
。因此,我使用了0
的直接缓冲区大小和我的密钥作为直接文件大小。