📄 key.c
字号:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <string.h>
void main()
{
unsigned long p,q;
unsigned long sk;
unsigned long y,c,d=1,h=0,j=0;
int *m,*x;
int i;
static char pki[20];
char ni[20];
static int s[20]={1};
int n[]={8,0,8,5,7,7,4,5,8,6,3,0,2,7,3,3,2,2,9,0};
static int n1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0};
int *pk;
FILE *sfp,*pfp;
char pkfile[100];
char skfile[100];
void perr(char *);
unsigned long shu();
int *add();
int *multi();
int *tz();
int *sub();
unsigned long chu();
int *di();
unsigned long mod();
unsigned long mu();
int cmp();
srand((unsigned)(time(NULL)));
do
{
p=shu();
q=shu();printf("\np=%u\nq=%uk",p,q);
x=multi(p,q);printf("x=");
for(i=0;i<20;i++){n[i]=x[i];
printf("%d",x[i]);}
}while(cmp(n,n1));
sk=shu();
m=multi(p-1,q-1);
printf("m=");
for(i=0;i<20;i++)
printf("%d",m[i]);
printf("\nsk=u%u",sk);printf("n=");
for(i=0;i<20;i++)
{ n1[i]=m[i];
printf("%d",n[i]);} c=chu(n1,sk);
printf("c=%u",c);
y=mod(n1,sk);
printf("y=%u",y);
while (d)
{
h++;
j+=(y+d)/sk;
d=(y+d)%sk;
}printf("h=%u,j=%u\n",h,j);
pk=multi(h,c);
add(pk,di(j));for(i=0;i<20;i++)printf("%d",pk[i]);for(i=0;i<20;i++){ni[i]=(char)(n[i]+48);pki[i]=(char)(pk[i]+48);}
printf("n=%s;",ni);printf("pk=%s",pki);
printf("\nEnter pkfile name(*.pk): ");
gets(pkfile);
printf("\nEnter skfile name(*.sk): ");
gets(skfile);
if((sfp=fopen(skfile,"wb+"))==NULL)perr("Can't creat new file!");
if((pfp=fopen(pkfile,"wb+"))==NULL) perr("Can't creat new file!");
fprintf(sfp,"n=%s;sk=%u",ni,sk);
fprintf(pfp,"n=%s;pk=%s",ni,pki);
fclose(sfp);
fclose(pfp);
}
unsigned long shu() /*产生素数++*/
{int g=1;
unsigned long x1=0,y,i,x2=4294967295;
while((x2>1000000000)||(x2<65536)||g)
{
x2=(unsigned long)(rand()*2-1);
x1=(unsigned )rand();
x1=(x1/10)<<16;
x2=x1|x2;
y=x2/2;printf("y=%u",y);
for(i=2;i<=y;i++)
if((x2%i)==0) break;
if(i>=y){g=0; printf("\ni=%u,x2=%u",i,x2);return (x2);}
}
}
void perr(s)
char *s;
{
printf("\n%s",s); exit(1);
}
unsigned long chu(int *m,unsigned long sk ) /*求除*/
{ int x[20];
int s;
static int y[20]={5,9,2,7,6,9,4,9,2,4};
unsigned long v,u,h,k=0,t=0;
int i,a;
int b;
printf("sk=%u",sk);
printf("\nm="); for(i=0;i<20;i++)printf("%d",m[i]);
u=4294967295%sk;
h=4294967295/sk;
for(a=0;a<20;a++)
x[a]=0;
for (a=19;a>=0;a--)
{for(b=0;b<10;b++)
{s=x[0];x[0]=x[b+1];
x[b+1]=s;
}printf("\nx=");
x[0]=m[a];
for(i=0;i<20;i++)printf("%d",x[i]);
while(cmp(x,y)>0)
{
add((sub(x,y)),di(u));
t=t+h; }
k=mu(x);
t=(t+k/sk)*10;
k=k%sk; printf("k=%u,t=%u",k,t);
v=k;
for(b=0;b<10;b++)
{
x[b]=v%10;
v=v/10;
}
}
return(t/10);
}
unsigned long mod(int *m,unsigned long sk ) /*求yu*/
{ int x[20];
int s;
static int y[20]={5,9,2,7,6,9,4,9,2,4};
unsigned long v,u,h,k=0,t=0;
int a;
int b;
u=4294967295%sk;
h=4294967295/sk;
for(a=0;a<20;a++)
x[a]=0;
for (a=19;a>=0;a--)
{for(b=0;b<10;b++)
{s=x[0];x[0]=x[b+1];
x[b+1]=s;
}
x[0]=m[a];
while(cmp(x,y)>0)
{
add((sub(x,y)),di(u));
}
k=mu(x);
k=k%sk;
v=k;
for(b=0;b<10;b++)
{
x[b]=v%10;
v=v/10;
}
}
return(k);
}
int *sub(int c[20],int q[20]) /*减法++*/
{
int i,a;
for(i=0;i<20;i++)
{if(c[i]>=q[i])
c[i]=c[i]-q[i];
else {a=1;
c[i]=c[i]+10-q[i];
while(c[i+a]==0)
{c[i+a]=9;
a++; }
c[i+a]--;
}
}
return(c);}
int cmp(int *n,int *m) /*比较 */
{
int i=19;
while(n[i]==m[i])
{
i--;
}
if(n[i]>m[i])
return 1 ;
else
return 0 ;
}
int *di(unsigned long w)/*替换成数组++*/
{static int h[20];
int i;
i=0;
while(w)
{
h[i]=w%10;
w=w/10;
i++;
}
return(h);
}
unsigned long mu(int m[20])/*替换成整数*/
{
unsigned long v=0;
int a=10;
while(a){a--;
v=v*10+m[a];
}
return(v);
}
int *tz(int *mut) /*调整数组++*/
{
int a,b,bi,i;
for(a=0;a<20;a++)
{
i=0;
b=mut[a];
mut[a]=mut[a]%10;
while(b)
{
i++;
b=b/10;
bi=b%10;
mut[a+i]+=bi;
}
}
return(mut);
}
int *multi(unsigned long p,unsigned long q) /*乘法++*/
{
int m[10][20];
int mul[20];
int a,b,c,d,t;
unsigned long u;
for (a=0;a<20;a++)mul[a]=0;
a=0;
while(p)
{
c=p%10;
p=p/10;
u=q;
b=0;
while(u)
{
d=u%10;
u=u/10;
t=c*d;
m[a][a+b]=t;
mul[a+b]+=m[a][a+b];
b++;
}
a++;}
tz(mul);
return(mul);
}
int *add(int *m,int *n) /*加法++*/
{
int a;
for(a=0;a<20;a++){m[a]=m[a]+n[a];
}tz(m);
return(m);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -