Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C服务器和客户端交换的mpz_t值不正确_C_Gmp - Fatal编程技术网

C服务器和客户端交换的mpz_t值不正确

C服务器和客户端交换的mpz_t值不正确,c,gmp,C,Gmp,我试图用C语言编写一个服务器和一个客户端来交换mpz_t值。程序使用GMP库和椭圆曲线库的一些函数。问题是客户端生成的值与服务器接收的值不同。你知道为什么会这样吗 int server(){ gmp_randstate_t status; mpz_t curv[2]; mpz_t p; mpz_t base_point[2]; mpz_t priv_numb; mpz_t rec; mpz_t key; int sockfd1, sockfd2; int clilen; struct sock

我试图用C语言编写一个服务器和一个客户端来交换mpz_t值。程序使用GMP库和椭圆曲线库的一些函数。问题是客户端生成的值与服务器接收的值不同。你知道为什么会这样吗

int server(){
gmp_randstate_t status;
mpz_t curv[2];
mpz_t p;
mpz_t base_point[2];
mpz_t priv_numb;
mpz_t rec; 
mpz_t key;
int sockfd1, sockfd2;
int clilen;
struct sockaddr_un srv_addr, cl_addr;
char *file="parameters.txt";


gmp_randinit_mt(status);
mpz_init(curv[0]); mpz_init(curv[1]);
mpz_init(p);
mpz_init(base_point[0]); mpz_init(base_point[1]);
mpz_init(priv_numb);
mpz_init(rec); 
mpz_init(key);

mpz_t seed;
long sd;
mpz_init(seed);

srand( (unsigned) getpid());
sd=rand();
mpz_set_ui(seed, sd);

gmp_randseed(status, seed);

mpz_urandomb(priv_numb, status, 8);
gmp_printf("priv_numb %Zd\n", priv_numb);

FILE *keyfd=fopen(file, "r");
gmp_fscanf(keyfd, "%Zd %Zd %Zd %Zd %Zd", curv[0], curv[1], p, base_point[0],base_point[1]);

fclose(keyfd);

gmp_printf("curv[0]: %Zd curv[1]: %Zd base[0]: %Zd\n base[1]: %Zd\n p: %Zd\n", curv[0], curv[1], base_point[0], base_point[1], p);
myzmulmod(key, priv_numb, base_point, p);// key = private*base_point mod p

gmp_printf("key: %Zd\n", key);

sockfd1 = socket(AF_LOCAL, SOCK_STREAM, 0);
if(!sockfd1) 
    printf("Error opening socket\n");
bzero( &srv_addr, sizeof( srv_addr ) );

srv_addr.sun_family = AF_LOCAL;
strcpy( srv_addr.sun_path, UNIXSTR_PATH );
unlink(srv_addr.sun_path);
if(bind(sockfd1, (struct sockaddr*) &srv_addr, sizeof(srv_addr))<0) {
    perror("Error on binding\n");
     exit(1);
}

listen(sockfd1,1);
clilen = sizeof(cl_addr);
sockfd2 = accept(sockfd1, (struct sockaddr *)&cl_addr, &clilen);


if(recv(sockfd2, &rec, sizeof(mpz_t),0) <0)
    printf("Could not receive key!!!\n");
else {
    gmp_printf("Received: %Zd \n", rec );
    printf("%d\n", sizeof(rec));
}

if(close(sockfd1)<0)
    perror("Error closing sockfd1");
if(close(sockfd2)<0)
    perror("Error closing sockfd2");

gmp_randclear(stat);
mpz_clear(curv[0]); mpz_clear(curv[1]);
mpz_clear(p);
mpz_clear(base_point[0]); mpz_clear(base_point[1]);
mpz_clear(priv_numb);
mpz_clear(key); 
return 0;}



 int client(){
gmp_randstate_t status;
mpz_t curv[2];
mpz_t p;
mpz_t base_point[2];
mpz_t priv_numb;
mpz_t rec; mpz_t key;
int sockfd1;
int clilen;
struct sockaddr_un srv_addr;
char *file="parameters.txt";

gmp_randinit_mt(status);
mpz_init(curv[0]); mpz_init(curv[1]);
mpz_init(p);
mpz_init(base_point[0]); mpz_init(base_point[1]);
mpz_init(priv_numb);
mpz_init(rec);
mpz_init(key); 


FILE *keyfd=fopen(file, "r");
gmp_fscanf(keyfd, "%Zd %Zd %Zd %Zd %Zd", curv[0], curv[1], p, base_point[0],base_point[1]);

fclose(keyfd);

gmp_printf("curv[0]: %Zd curv[1]: %Zd base[0]: %Zd\n base[1]: %Zd\n p: %Zd\n", curv[0], curv[1], base_point[0], base_point[1], p);

mpz_t seed;
long sd;
mpz_init(seed);

srand( (unsigned) getpid());
sd=rand();
mpz_set_ui(seed, sd);
gmp_randseed(status, seed);

mpz_urandomb(priv_numb, status, 8);

gmp_printf("priv_numb %Zd\n", priv_numb);
myzmulmod(key, priv_numb, base_point, p);

sockfd1 = socket(AF_LOCAL, SOCK_STREAM, 0);
if(!sockfd1) 
    printf("Error opening socket\n");
srv_addr.sun_family = AF_LOCAL;
strcpy( srv_addr.sun_path, UNIXSTR_PATH );


if(connect(sockfd1, (struct sockaddr *)&srv_addr, sizeof(srv_addr)) < 0)
    printf("Connection error!!! \n");

if(send(sockfd1, &key, sizeof(key), 0)<0)
    printf("Could not send public key!! \n");
else
    { 
    printf("I sent %d bytes:", sizeof(key));
    gmp_printf(" %Zd\n", key);
    }

if(close(sockfd1)<0)
    perror("Error closing socket!");

gmp_randclear(status);
mpz_clear(curv[0]); mpz_clear(curv[1]);
mpz_clear(p);
mpz_clear(base_point[0]); mpz_clear(base_point[1]);
mpz_clear(priv_numb);
mpz_clear(key);

return 0;}
int服务器(){
gmp\u随机状态\u t状态;
mpz_t曲线[2];
mpz_t p;
mpz_t基点[2];
mpz_t priv_numb;
mpz_t rec;
mpz_t键;
int sockfd1、sockfd2;
int clilen;
结构sockaddr_un srv_addr,cl_addr;
char*file=“parameters.txt”;
gmp\u randinit\u mt(状态);
mpz_init(curv[0]);mpz_init(curv[1]);
mpz_初始(p);
mpz_init(基点[0]);mpz_init(基点[1]);
mpz_init(priv_numb);
mpz_init(rec);
mpz_init(键);
mpz_t种子;
长sd;
mpz_init(seed);
srand((未签名)getpid());
sd=兰德();
mpz_集(seed,sd),;
gmp_randseed(状态,种子);
mpz_urandomb(私人,身份,8);
gmp_printf(“priv_numb%Zd\n”,priv_numb);
FILE*keyfd=fopen(文件“r”);
gmp_fscanf(keyfd,“%Zd%Zd%Zd%Zd%Zd%Zd”,曲线[0],曲线[1],p,基点[0],基点[1]);
fclose(keyfd);
gmp_printf(“曲线[0]:%Zd曲线[1]:%Zd基准[0]:%Zd\n基准[1]:%Zd\n p:%Zd\n”,曲线[0],曲线[1],基准点[0],基准点[1],p”);
myzmulmod(key,priv_numb,base_point,p);//key=private*base_point mod p
gmp_printf(“键:%Zd\n”,键);
sockfd1=套接字(AF_本地,SOCK_流,0);
如果(!sockfd1)
printf(“打开套接字时出错\n”);
bzero(&srv_addr,sizeof(srv_addr));
srv_addr.sun_family=AF_LOCAL;
strcpy(srv_addr.sun_path,UNIXSTR_path);
取消链接(srv地址sun路径);

如果(bind(sockfd1,(struct sockaddr*)&srv_addr,sizeof(srv_addr))您需要在发送前使用其中一种将
mpz_t
s转换为标准C类型,然后在收到它们时使用转换返回


为了实现最大的可移植性,您还应该在发送之前将C类型从主机字节顺序转换为网络字节顺序,然后在收到它们时将它们从网络字节顺序转换回主机字节顺序。您可以使用来执行此操作。

mpz\u t
包含指向动态分配数据的指针-您没有正确序列化它。建议在
键上使用一个mpz输出函数
你是说像mpz_out_str这样的函数吗?我尝试了你的建议,但是我在服务器中使用的赋值函数没有还原客户端生成的原始值。我想这可能是因为原始mpz_t值太大,所以只有一部分存在ved。转换函数页面中提到可能会发生这种情况。有什么方法可以避免这种情况吗?您可以使用
mpz\u get\u str()
将其转换为字符串,然后像那样发送,然后使用
mpz\u set\u str()
将其转换回。