【问题标题】:Weird unsigned char * concat behavior奇怪的 unsigned char * concat 行为
【发布时间】:2017-03-13 16:26:54
【问题描述】:

我有两个无符号字符数组和一个字符数组。我想对两个 unsigned char 数组进行异或运算,然后加入一个 char 数组。

char mensaje[] = "A";
unsigned char key[] = "61181d3cfd91b0cc0890c2c0646c94f692b311ffbf93749c0aadd8ae6f04f044";
test(key, mensaje)



void test(unsigned char key[],char mensaje[]){

        unsigned char   pad_exterior[64];
        unsigned char   pad_interior[64];
        for(int i =0 ; i<64; i++ ){
            pad_exterior[i]= 0x5c ^ key[i];
            pad_interior[i]= 0x36 ^ key[i];
        }


    char * result = new char[strlen(mensaje)+ 64];
    copy(mensaje, mensaje + strlen(mensaje), result);
    copy(pad_interior, pad_interior + 64, result + strlen(mensaje));


    char * result2 = new char[strlen(mensaje)+ 64];
    copy(mensaje, mensaje + strlen(mensaje), result2);
    copy(pad_exterior, pad_exterior + 64, result2 + strlen(mensaje));
}

问题是,最后,strlen(pad_exterior) = 65 但 strlen(pad_interior) =1。

但是,如果我替换

pad_interior[i]= 0x36 ^ key[i];

pad_interior[i]= 0x36;

确实有效。

为什么会有这种奇怪的行为? 有没有更好的方法来完成我想做的事情?我已经尝试了十几种方法来复制数组。

编辑: 我想我需要 char 数组,因为我打电话给EVP_DigestUpdate。 测试函数基本上只是 xor 并加入数组。 调用在代码开头

【问题讨论】:

  • 这个test函数怎么称呼?您能尝试创建一个Minimal, Complete, and Verifiable Example 并展示给我们看吗?此外,如果您使用 C++ 编程,请不要添加 C 标记。
  • 另外,strlen(mensaje) 将永远是 1。如果您使用 C++ 编程,为什么要使用简单数组而不是 std::stringstd::vector
  • 检查0x36 ^ '6'的值。
  • 我已经编辑了问题。
  • 您可能还缺少将密钥从十六进制数字字符串形式转换为实际字节的步骤。

标签: c++


【解决方案1】:

strlen 旨在与 null 终止 char 数组一起使用。它使用\0 终止符来实际查找长度。

所以如果0x36 ^ key[i]0,你的pad_interior 过早地变为空终止。

如果0x5c ^ key[i] 从不为零,您的pad_exterior 不会以空值结尾。当您执行strlen(pad_exterior) 时,您会遇到UB。你只是有点幸运,它返回了 65。

【讨论】:

  • 哇,那我该怎么办?
  • @Gaston 使用std::string,中间可以有空值。
  • 在代码中,pad_exterior 被正确地用作定长缓冲区。只是您的“调试”检查是错误的。你不能在那里使用 strlen,但它在实际的纯文本上很好,它是一个空终止的字符串..
  • @Gaston,我刚刚注意到您发布的代码与您的问题不符。你从来没有真正在pad_interior pad_exterior 上打电话给strlen
  • 对不起,我只是在调试器中调用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2012-11-18
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
相关资源
最近更新 更多