是什么导致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()时,我不会返回0StrCmp()以外的值
也会在第一个空字节处停止,因此您也不能使用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