1

我这里有这段代码

#include<stdio.h>

#define LEN 10

char buf[] = {0xff,0xaa,0xfc,0xe8,0x89,0x00,0x00,0x00,0x60,0x89};
char key[] = "SAMPLE KEY";

int main()
{
        int i;
        char enc[LEN];
        for(i=0;i<LEN;i++)
        {
                enc[i] = (key[i % LEN] ^ buf[i]);
                printf("0x%x,",enc[i]);
        }
}

哪个输出

输出

0xffffffac,0xffffffeb,0xffffffb1,0xffffffb8,0xffffffc5,0x45,0x20,0x4b,0x25,0xffffffd0

预期输出在哪里

0xac,0xeb,0xb1,0xb8,0xc5,0x45,0x20,0x4b,0x25,0xd0,

我怎样才能解决这个问题 ?为什么会这样?

4

4 回答 4

3

在声明中更改bufenc键入charunsigned char

char无论是 asigned还是类型都是实现定义的unsigned,并且在您的实现中它显然是一个signed类型。

于 2013-09-08T15:02:54.560 回答
1

您的加密工作正常。你的问题是你已经声明enc为一个签名数组字符数组。(正如 ouah 正确指出的那样,char默认情况下可以签名或未签名。在您的编译器上,它显然已签名。)

因此,0xAC具有 MSB 集的字符被解释为负数。当您将它们传递给 时printf(),它们会隐式转换为整数,因此进行符号扩展为 32 位。

要修复它,只需声明enc,keybuf显式声明为unsigned chars 的数组。或者,您可以使用 Ben Voigt 的解决方案并屏蔽掉额外的位,但随后您将毫无意义地对字符进行符号扩展,只是为了再次屏蔽这些额外的位。

附言。您确实意识到,如果您加密的任何内容都比密钥长得多,那么这种“加密”是非常弱的,对吧?

于 2013-09-08T16:01:50.620 回答
0

OP 正在使用一种%x用于unsigned.

由于一个char值​​变成了一个int带有printf()... 参数的值,所以使用一个%hhx用于. 的格式char。这将只打印该char部分。例子:

printf("0x%02hhx,",enc[i]);  --> 0xac,
于 2013-09-08T16:11:35.017 回答
0

现在,您不仅有前导符号扩展位,而且还缺少前导零。

利用

printf("0x%02x,", enc[i] & 0xFFu);
于 2013-09-08T15:51:09.833 回答