奇怪的unsigned char * concat行为

时间:2016-10-31 14:53:04

标签: c++

我有两个unsigned char数组和一个char数组。我想xor两个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并加入数组。 该调用位于代码的开头

1 个答案:

答案 0 :(得分:5)

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

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

如果0x5c ^ key[i] 从不为零,则pad_exterior不会终止。当你strlen(pad_exterior)时,你会遇到UB。你只有一点幸运,它返回65.