【问题标题】:Print of unsigned char different each time每次打印不同的无符号字符
【发布时间】:2014-02-04 19:58:32
【问题描述】:

所以我尝试使用 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:好的,所以我现在像 Scott 建议的那样打印

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

然后将文本打印为 185286171186254254254

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

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

【问题讨论】:

  • 您打印的是文本地址而不是内容。
  • 哦,谢谢。你能解释一下为什么,以及我将如何解决这个问题吗?
  • 类似printf("Text before is %x %x %x\n", text[0], text[1], text[7]);(还有5个文本[])
  • 感谢 chux,%x 使它正确打印出来

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


【解决方案1】:

你的数据类型是char[],所以你真的应该打印一个字符串!

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

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

为什么数字会改变?

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

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

【讨论】:

  • 谢谢。为什么出来的这么乱? (带有奇怪的 4V 和问号)。
  • 注意 b/c 长度为 8 并且有 8 元素将没有空终止字符。因此,除非文本中有一个额外的空终止字符是可以的,否则比使用for 循环和逐字符打印可能是更好的选择。
  • 尝试更新 OP 以反映 @ShafikYaghmour 的建议以及新的印刷品,我们可以进一步帮助您。 ShafikYaghmour 好点,我已经相应地更新了答案。
  • 好的,谢谢,我已经用它一致打印的新打印更新了它 (185286171186254254254)。现在我想弄清楚它是从哪里来的。
【解决方案2】:

您正在尝试在以下语句中打印数组“文本”的地址

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);

【讨论】:

    猜你喜欢
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2014-03-06
    • 2016-10-29
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多