是什么导致memcpy和strcpy在复制openssl BIGNUM方面存在差异

是什么导致memcpy和strcpy在复制openssl BIGNUM方面存在差异,c,openssl,memcpy,strcpy,C,Openssl,Memcpy,Strcpy,当我编程时,这个问题困扰了我一个小时,但解决后我仍然不知道原来方法的错误 void generate_r_vector(char (*r_vector)[17],char *random_r) { BIGNUM* vector[127]; char r_v[128][17]; char flag[17]; memset(flag, 0, sizeof(flag)); int bits = 128; int top = 0; int bott

当我编程时,这个问题困扰了我一个小时,但解决后我仍然不知道原来方法的错误

void generate_r_vector(char (*r_vector)[17],char *random_r) {
    BIGNUM* vector[127];
    char r_v[128][17];
    char flag[17];
    memset(flag, 0, sizeof(flag));
    int bits = 128;
    int top = 0;
    int bottom = 0;
    for (int i = 0; i < 127; i++) {
        vector[i] = BN_new();
        BN_rand(vector[i], bits, top, bottom);
        memset(r_v[i], 0, sizeof(r_v[i]));
        BN_bn2bin(vector[i], r_v[i]);
    }
    memset(r_v[127], 0, sizeof(r_v[127]));
    for (int i = 0; i < 127; i++) {
        for (int j = 0; j < 16; j++) {
            flag[j] = flag[j] ^ r_v[i][j];
        }
    }
    for (int i = 0; i < 16; i++) {
        r_v[127][i] = flag[i] ^ random_r[i];
    }
    
    
    for (int i = 0; i < 128; i++) {
        memcpy(r_vector[i], r_v[i], 17);
    }
}
是什么导致memcpy和strcpy在复制openssl BIGNUM方面存在差异

注释“BIGNUM值不是C字符串,因此
strcpy()
不起作用。”可能不足以启发您。

BIGNUM值可以包含一个所有位都设置为0的字节,称为空字符,由于该字节用于终止字符串,
strcpy()
停止在那里,不会复制BIGNUM值的其余部分。

即使strcpy和memcpy都用于char数组,它们也不会执行完全相同的操作。memcpy复制固定数量的字节,作为第三个参数。strcpy不仅仅是从一个字符数组或指针复制到另一个字符数组或指针,它还以完全不同的方式计算要复制多少字符,即通过检查要复制的字符中的0值


即使r_vector指向字符数组,它们也不一定是字符串:如果它们不是以0结尾的,或者在其他位置有0个值,那么它们的行为将与字符串不同。

不清楚您在这里要问什么。您是说“为什么我不能使用
strcpy()
复制BIGNUM值?”如果是这样,答案是肯定的“BIGNUM值不是C字符串,因此
strcpy()
将不起作用。”如果每4位转换一次,这是十六进制,而不是十进制。除非指定为以NUL结尾的字符串,否则不能使用
strcpy()
。谢谢你的回答,抱歉,因为我的英语能力使这句话模棱两可。我使用了一个更准确的表达:每4位转换成10位。翻译软件可以翻译两位数字(XX类似于两位数字,如67 54)翻译成十进制英语可能是个问题。这就是为什么代码很有帮助,比如如果你能告诉我们你用什么输入,以及我们通常能更好地理解的预期输出。我希望这个函数能实现这样的功能:输入128位字符串并返回128位字符串。128位字符串的异或值正是128位字符串输入。比谢谢你的回复。我使用strcpy和memcpy生成256个字符串(每个128个字符串)。并使用StrCmp函数逐个匹配,它们都是相同的(使用if判断是否为0)。但是当我分别对这两组字符串进行异或运算时,得到的结果不同。如果是因为结尾字符,那么StrCmp匹配时是否应该不相等。谢谢你的回答。但是当我使用StrCmp()时,我不会返回0
StrCmp()以外的值
也会在第一个空字节处停止,因此您也不能使用
strcmp
来比较BIGNUM值。非常感谢您的重复回答。我认为您的回答解决了我的问题
int main() {
    char* random_r="1234567891234567";//长度16 算上'\0'17
    char r_vector[128][17];
    BIGNUM* vector[127];
    char r_v[128][17];
    char flag[17];//判断是否一致
    memset(flag, 0, sizeof(flag));
    int bits = 128;
    int top = 0;
    int bottom = 0;
    for (int i = 0; i < 127; i++) {
        vector[i] = BN_new();
        BN_rand(vector[i], bits, top, bottom);
        memset(r_v[i], 0, sizeof(r_v[i]));
        BN_bn2bin(vector[i], r_v[i]);
    }
    memset(r_v[127], 0, sizeof(r_v[127]));
    for (int i = 0; i < 127; i++) {
        for (int j = 0; j < 16; j++) {
            flag[j] = flag[j] ^ r_v[i][j];
        }
    }
    for (int i = 0; i < 16; i++) {
        r_v[127][i] = flag[i] ^ random_r[i];
    }
    //至此生成了128个向量,这些向量的异或之和正好是random_r的值,ans可以验证这个结论
    char ans[17];
    memset(ans, 0, sizeof(ans));
    for (int i = 0; i < 128; i++) {
        for (int j = 0; j < 16; j++) {
            ans[j] = ans[j] ^ r_v[i][j];
        }
    }
    printf("the target XOR result is:%s\n", ans);//
    //下面使用memcpy的形式拷贝并求异或值
    for (int i = 0; i < 128; i++) {
        memcpy(r_vector[i], r_v[i], 17);//逐字节拷贝解决问题strcpy会出现问题,原因未知
    }
    memset(ans, 0, sizeof(ans));
    for (int i = 0; i < 128; i++) {
        for (int j = 0; j < 16; j++) {
            ans[j] = ans[j] ^ r_vector[i][j];
        }
    }
    printf("using memcpy copying and the result is:%s\n", ans);//这是正确的结果
    
    
    memset(r_vector, 0, sizeof(r_vector));
    for (int i = 0; i < 128; i++) {
        strcpy(r_vector[i], r_v[i]);//strcpy会出现问题,原因未知
    }
    memset(ans, 0, sizeof(ans));
    for (int i = 0; i < 128; i++) {
        for (int j = 0; j < 16; j++) {
            ans[j] = ans[j] ^ r_vector[i][j];
        }
    }
    printf("using strcpy copying and the result is:%s\n", ans);
    int err_count = 0;
    for (int i = 0; i < 128; i++) {
        if (strcmp(r_vector[i], r_v[i]) != 0) err_count++;
    }
    printf("after using strcpy() each vector using strcmp() with orignal r_v,the different vector nums:%d\n", err_count);

    system("pause");
    return 0;
}
the target XOR result is:1234567891234567
using memcpy copying and the result is:1234567891234567
using strcpy copying and the result is:12eH⊙碡?H-c纫
after using strcpy() each vector using strcmp() with orignal r_v,the different vector nums:0