每次打印无符号字符不同

时间:2014-01-16 03:30:59

标签: c encryption printf unsigned-char cbc-mode

所以我正在尝试使用cbc_crypt来尝试加密和解密不同的字符串。到目前为止,这是我的计划。

int main(int argc, char *argv[])
{
  unsigned char key[8] = {0x00, 0x00, 0x00, 0x68, 0x67, 0x01, 0x75, 0x19};
  unsigned char iv[8] = {0xe0, 0x3d, 0x36, 0x0c, 0x55, 0xfc, 0xe4, 0x0f};
  unsigned char ciphertext[96] = {0xb2, 0xc0, 0x11, 0xd6, 0x58, 0xce, 0x4b, 0x3\
c, 0xa6, 0x05, 0x93, 0x4d, 0x4f, 0x4c, 0x80, 0x19, 0x3f, 0xb5, 0xa8, 0xd6, 0x03\
, 0xec, 0xf9, 0xbc, 0xb0, 0xea, 0x36, 0xe9, 0x8f, 0x3d, 0x94, 0x95, 0x02, 0xa8,\
 0xc0, 0x48, 0x23, 0xba, 0x51, 0xab, 0x65, 0x7f, 0xc2, 0xb8, 0xff, 0xfc, 0x3e, \
0x40, 0xdd, 0xfc, 0xd3, 0xe9, 0x32, 0x43, 0xd2, 0xf2, 0x37, 0x47, 0xab, 0x0d, 0\
x30, 0xba, 0xd0, 0x9e, 0x88, 0x66, 0x2b, 0x22, 0xdf, 0xed, 0x06, 0x76, 0xdb, 0x\
3a, 0xd5, 0x79, 0x7e, 0x22, 0x28, 0xcf, 0x3c, 0x5e, 0xbb, 0xc5, 0x85, 0xa0, 0x3\
f, 0x21, 0xab, 0xa8, 0xbe, 0x74, 0x37, 0xae, 0x59, 0xe9};



  unsigned char short_cipher[8] = {0xb2, 0xc0, 0x11, 0xd6, 0x58, 0xce, 0x4b, 0x\
3c};

  unsigned char text[8] = {0x12, 0x34, 0x56, 0xab, 0xba, 0xfe, 0xfe, 0xfe};

  printf("Text before is %u \n", text);
  // cbc_crypt(key, text, 8, 1, iv);                                            
  printf("Text after is %u \n", text);

  return;
}

请注意,cbc_crypt 已注释掉。当我在cbc_crypt被注释掉的时候运行它时会发生这种情况。

[dorset:usabledir] 247) gcc guessdes.c
[dorset:usabledir] 248) ./a.out
Text before is 73623220 
Text after is 73623220 

[dorset:usabledir] 249) ./a.out
Text before is 9cf73030 
Text after is 9cf73030 

[dorset:usabledir] 249) ./a.out
Text before is f46e1bc0 
Text after is f46e1bc0 

[dorset:usabledir] 249) ./a.out
Text before is 674ed540 
Text after is 674ed540 

我无法弄清楚为什么每次打印时文本都会发生变化。我甚至没有尝试运行加密,我只是打印出我初始化的unsigned char。任何帮助,将不胜感激。

编辑:显然我应该使用%s。如果我这样做,它现在打印一致。

[dorset:usabledir] 256) ./a.out
Text before is 4V???????%< 
Text after is 4V???????%< 

[dorset:usabledir] 256) ./a.out
Text before is 4V???????%< 
Text after is 4V???????%< 

[dorset:usabledir] 256) ./a.out
Text before is 4V???????%< 
Text after is 4V???????%< 

有人可以解释为什么以前打印地址吗?还有,有办法用十六进制打印吗? (我真的不明白4V和所有问号的来源)。

编辑2:好的,所以我现在打印像斯科特建议的那样

  for(i = 0; i < 8; i++){
    printf("%u", text[i]);
  }

然后将文本打印为185286171186254254254

我正在试图弄清楚它与原始十六进制代码{0x12,0x34,0x56,0xab,0xba,0xfe,0xfe,0xfe}的匹配程度。

编辑:我意识到我应该使用%x而不是%u。现在正确打印123456abbafefefe!多谢你们。

2 个答案:

答案 0 :(得分:2)

您的数据类型为char[],因此您应该真正打印字符串!

在printf中使用%s而不是%u

请注意,您的字符串目前不是null terminated。这意味着printf()不知道何时停止打印。在发送到printf()之前在每个字符串的末尾添加0x00将解决此问题。

为什么数字会改变?

您正在打印的数字是指向您创建的C-Strings的指针。在每次新的程序运行时,它们都会发生变化,因为整个程序都有不同的内存部分可以在里面运行!

每次运行程序时,几乎可以保证将其分配到内存中的不同位置(虚拟和物理)。您的程序不是计算机上运行的唯一程序。内存不断被分配和释放,以跟上计算机上运行的所有程序。因此,每次运行时,您的程序不一定会被传递给内存相同的“块”。

答案 1 :(得分:1)

您正尝试在以下语句

中打印数组'text'的地址
printf("Text before is %u \n", text);

每次运行程序时,它都被加载到不同的地址,这就是为什么每次都获得不同的值。

如果要在地址文本处打印字符串,则可以使用

printf("Text before is %s \n", text);

语句但请注意,您的字符串不是NULL终止,您可能会在8个字符后打印一些垃圾数据。

如果要将值打印为无符号整数,可以使用

printf("Text before is %u \n", (unsigned int)*text);