#include<stdlib.h>#include<stdio.h>#include<time.h>int xy[22];// 判断两个数是否互质intisHuZhi(int a,int b){return b ==0? a :isHuZhi(b, a % b);}intmyPow(int a,int b,int m){int res =1;
a %= m;while(b !=0){if((b &1)==1)
res =(res * a)% m;
a =(a * a)% m;
b >>=1;}printf("rea=%d",res);return res;}//求q intcandp(int g,int p){for(int i =0;i<p;i++){for(int j=1;j<=g;j++){
g=g*g;}if(g%p==1){printf("a=%d\n",i);return i;}}}// 求 a mod b 的逆元voidexGcd(int a,int b){if(b ==0){
xy[0]=1;
xy[1]=0;}else{exGcd(b, a % b);int x = xy[0];
xy[0]= xy[1];
xy[1]= x -(a / b)* xy[1];}}main(){int p,q,g,x,y,s,k,e,ni,d,m,n,t,h,c,r,r1;printf("请输入大素数 p ");scanf("%d",&p);
m=16;
h=11;//生成元
q=11;
g=6;//candp(q,p);printf("g=%d",g);srand(time(NULL));//随机数种子
x=10;//rand()%p-1+2 ;
y=myPow(g, x, p);// y是公开密钥printf("y=%d\n",y);
k =9;//rand()%p-1+1 ;// while (isHuZhi(k, p-1) != 1) {// k = 11;//rand()%p-1+1 ;// }printf("k=%d",k);// r = g^k mod p
r =myPow(g, k, p);printf("r=%d\n",r);
e=13;
s=(x*e+k)%q;printf("(e,s)=(%d,%d)",e,s);exGcd(y,p);
ni=xy[0];printf("ni=%d\n",ni);
r1=myPow(g, s, p)*myPow(ni, e, p)%p;if(r==r1){printf("有效");}else{printf("无效");}}
Schnorr签名算法(初始化和签名)Schnorr签名算法(验证)Schnorr签名算法(正确性)Schnorr签名算法(举例)Schnorr签名算法(举例)C语言实例#include <stdlib.h>#include <stdio.h>#include <time.h>int xy[22];// 判断两个数是否互质int isHuZhi(int a, int b) { return b == 0 ? a : isHuZhi(