c++ - 奇怪的 unsigned char * concat 行为

标签 c++

我有两个无符号字符数组和一个字符数组。我想异或两个无符号字符数组,然后加入一个字符数组。

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;

它确实有效。

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

编辑: 我认为我需要字符数组,因为我正在调用 EVP_DigestUpdate . 测试函数基本上只是异或并连接数组。 调用在代码的开头

最佳答案

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

因此,如果 0x36 ^ key[i]0,您的 pad_interior 过早变为 null 终止。

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

关于c++ - 奇怪的 unsigned char * concat 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40344707/

相关文章:

c++ - Lua:多次调用返回字符串的 Lua 函数。如何做到这一点,以便有交叉到下一个实例的字段

c++ - typedef-ing 模板类型是否实例化它?

c++ - 修改std::vector是否会使迭代器无效?

C++:条件变量等待

c++ - 在哪里可以找到 C++ 的 ZwCreateFile 示例?

c++ - 模幂运算的问题

c++ - 寻找半 float 或四分之一 float 库

c++ - 可变参数模板函数的特化

c++ - 使用 SFINAE 结构定义的正确方法

c++ - 使用 gnuplot 制作 3D 曲面图