还剩26页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
#includestdio.h#includestring.h#include stdlib.h#include time.h#include math.h#include malloc.h#define MAX100#define LENsizeofstruct slinkvoid subint a[MAX],int b[MAX],int c[MAX];struct slinkint bignum[MAX];用来标记正负号,正,负来标记实际长度*//*bignum
[98]1bignum
[99]struct slink*next;/*/--------------------------------------自己建立的大数运算库--------------------------------------刃void print int a[MAX]int i;fori=0;ia
[99];i++printfn%dH,a[a
[99]-i-l];printfn\n\nn;return;int cmpint al[MAX],int a2[MAX]{int11,12;int i;ll=al
[99];12=a2
[99];if1112return1;ifll12return-1;fori=ll-l;i=0;i—ifal[i]a2[i]return1;ifal[i]a2[i]return-1;movp,b;whilecmpb,l!=0fori=0;iMAX;i++w[i]=c[i]=0;divtb,t,w,c;/*//c=p mod2w=p/2*/〃二movw,b;/*p p/2*/余数ifcmpc,l==0/*/c==l*/fori=0;iMAX;i++w[i]=0;multemp,m,w;movw,temp;fori=0;iMAX;i++w[i]=c[i]=0;为余二为商divttemp,n,w,c;/*/c ctemp%n,w w=temp/n*/movc,temp;fori=0;iMAX;i++s[i]=0;mulm,m,s;//s=a*afori=0;iMAX;i++c[i]=0;divts,n,w,c;/*/w=s/n;c=s modn*/mov c,m;fori=0;iMAX;i++s[i]=0;mulm,temp,s;fori=0;iMAX;i++c[i]=O;divts,n,w,c;余数给mov c,m;/*s m*/为后面的汉字显示须要,用第位做为标记*/m[MAX-2]=a[MAX-2];/*99return;/*/k=temp*k%n;*/int is_prime_sanint p[MAX]int i,a[MAX],t[MAX],s[MAX],o[MAX];fori=0;iMAX;i++s[i]=o[i]=a[i]=t[i]=0;t
[0]=l;t[MAX-l]=l;a
[0]=2;//{2,357a[MAX-l]=l;subp,t,s;expmoda,s,p,o;ifcmpo,t!=0return0;a
[0]=3;;fori=0;iMAX;i++o[i]=0expmoda,s,p,o;ifcmpo,t!=0return0;a
[0]=5;fori=0;iMAX;i++o[i]=0;expmoda,s,p,o;ifcmpo,t!=0return0;a
[0]=7;fori=0;iMAX;i++o[i]=0;expmoda,s,p,o;ifcmpo,t!=0return0;return1;}求两个大数之间是否互质////*/int coprimeinte[MAX],int s[MAX]/*////int a[MAX],b[MAX],c[MAX],d[MAX],o[MAX],l[MAX];int i;fori=0;iMAX;i++l[i]=o[i]=c[i]=d[i]=0;o
[0]=0;o[MAX-l]=l;1[O]=1;1[MAX-1]=1;move,b;movs,a;doifcmpb,l==0return1;fori=0;iMAX;i++c[i]=O;divta,b,d,c;〉movb,a;/*b---a*/movc,b;/*c—b*/}whilecmpc,o!=0;/*printfHIhey arenot coprime!\n;*/return0;void prime_randomint*p,int*qint i,k;time11;;p
[0]=l;q
[0]=3//p
[19]=l;//q
[18]=2;p[MAX-l]=10;q|MAX-l]=ll;dot=timeNULL;srandunsigned longt;fori=1;ip[M AX-1]-1;i++k=rand%10;p[i]=k;k=rand%10;while k==0k=rand%10;p[p[MAX-l]-l]=k;”素数为:;}whileis_prime_sanp!=1;printf pfori=0;ip[M AX-1];i++printfn%dn,p[p[M AX-1]-i-1];printf,\n\nn;do{t=timeNULL;srandunsigned longt;fori=l;iq[MAX-l];i++{k=rand%10;q[i]=k;}whileis_prime_sanq!=l;”素数为:;printf qfori=0;iq[MAX-l];i+4-printfn%dH,q[q[M AX-1]-i-1];printfH\n\nn;return;void erandinte[MAX],int m[MAX]{int i,k;time_t t;e[MAX-l]=5;随机产生一个与互素的printf p-l*q-l e dot=timeNULL;srandunsigned longt;fori=0;ie[M AX-1]-1;i++k=rand%10;e[i]=k;whilek=rand%10=0k=rand%10;e[e[MAX-l]-l]=k;}whilecoprime e,m!=l;fori=0;ie[MAX-l];i++printfn%dn,e[e[MAX-1]-i-1];printf,\n\nn;return;void rsadinte[MAX],int g[MAX],int*d intr[MAX],nl[MAX],n2[MAX],k[MAX],w[MAX];int i,t[MAX],b l[MAX],b2[MAX],temp[MAX];movg,nl;move,n2;fori=0;iMAX;i++k[i]=w[i]=r[i]=temp[i]=bl[i]=b2[i]=t[i]=0;bl[MAX-l]=0;b1
[0]=0;/*/b1=0;*/b2[MAX-l]=l;b2
[0]=l;/*/b2=1;*/whilel fori=0;iMAX;i++k[i]=w[i]=0;divtn1,n2,k,w;/*/k=n l/n2;*/fori=0;iMAX;i++temp[i]=0;二mulk,n2,temp;/*/temp k*n2;*/fori=0;iMAX;i++r[i]=0;subnl,temp,r;ifr[MAX-l]==lr
[0]==0/*/r=0*/break;else movn2,n1;/*/n1=n2;*/mov r,n2;/*/n2=r;*/movb2,t;/*/t=b2;*/fori=0;iMAX;i++temp[i]=0;mulk,b2,temp;/*/b2=b1-k*b2;*/fori=0;iMAX;i++b2[i]=0;subbl,temp,b2;movt,bl;fori=0;iMAX;i++t[i]=O;;addb2,g,tfori=0;iMAX;i++temp[i]=d[i]=O;divtt,g,temp,d;由以上的和计算得出的printf p-l*q-l ed:fori=0;id[MAX-l];i++printfn%dn,d[d[M AX-1]-i-1];printfn\n\nn;/*/求解密密钥的函数依据unsigned longrsaunsigned longp,unsigned longq,unsigned longed算法*/Euclidunsigned longg,k,r,nl,n2,t;unsigned longbl=0,b2=l;g=p-l*q-l;;nl=gn2=e;whilelk=nl/n2;r=nl-k*n2;ifr!=Onl=n2;n2=r;t=b2;b2=bl-k*b2;bl=t;elsebreak;return g+b2%g;/*/-----------------------------------------导入导出公钥和私钥一〃导入公钥void loadpkeyinte[MAX],int n[MAX]FILE*fp;char filename
[25],str[MAX],ch;int i,k;fori=0;iMAX;i++e[i]=n[i]=0;whilel printf^\n,^;为导入请输入加密密钥对文件路径:printf e,n,\rT;scanf%s,filename;iffp=fopenfilename,Hrn==NULL printf叫俞入的文件不存在,请重新输入!\n elsebreak;k=0;whilech=fgetcfp!=EOFifch!=str[k]=ch;k++;elsefori=0;ik;i++e[i]=str[k-i-l]-48;e[MAX-l]=k;k=0;fori=0;ik;i++n[i]=str[k-i-l]-48;n[MAX-l]=k;printfn\n加密密钥e:;fori=O;ie[MAX-l];i++printfn%dn,e[e[MAX-1]-i-1];printfH\nH;printfH\n公钥n:;fori=0;in[MAX-l];i++printfn%dn,n[n[MAX-l]-i-l];printfn\nH;fclosefp;printfH\n导入e,n胜利!\n;getchar;〃导入私钥void loadskeyintd[MAX],int n[MAX]FILE*fp;char filename
[25],str[MAX],ch;int i,k;fori=0;iMAX;i++d[i]=n[i]=0;whilel为导入请输入解密密钥对文件的路径:printf d,n,\n”;scanfn%sn,filename;iffp=fopenfilename,nr==NULL输入的文件不存在,请重新输入!;printff\n”else break;}k=0;whilech=fgetcfp!=EOFifch!=f*str[k]=ch;k++;fori=0;ik;i++d[i]=str[k-i-l]-48;d[MAX-l]=k;k=0;fori=0;ik;i++n[i]=str[k-i-l]-48;n[MAX-l]=k;printfH\n解密密钥d:”;fori=0;id[MAX-l];i++printfu%dH,d[d[MAX-l]-i-l];printfn\nn;printfn\n公钥n:;fori=0;in[MAX-l];i++printfn%dH,n[n[M AX-1]-i-1];printfH\nn;fclosefp;printfn\n导入d,n胜利!\n;getchar;导出公钥}void savepkeyinte[MAX],int n[MAX]//FILE*fp;int i;char savefile
[25],ch;导出加密密钥存放的文件路径为:;printf e,n,scanfn%sH,savefile;printfu\nn;fp=fopensavefile,nwn;fori=0;ie[MAX-1];i++ch=e[e[MAX-l]-i-l]+48;fputcch,fp;ch=fputcch,fp;fori=0;in[MAX-1];i++return0;void movint a[MAX],int*b;intjforj=0;jMAX;j++b[j]=a[j];return;void mulint al[MAX],inta2[MAX],int*cint i,j;inty;int x;int z;int w;int11,12;ll=al[MAX-l];12=a2[MAX-l];ifal[MAX-2]==,-,a2[MAX-2]==,-*c[MAX-2]=0;else ifal[MAX-2]=-]=」;c[MAX-2else ifa2[MAX-2]==t-1c[MAX-2]=-\fori=0;ill;i++forj=0;j12;j++x=al[i]*a2[j];y=x/10;z=x%10;w=i+j;c[w]=c[w]+z;c[w+l]=c[w+l]+y+c[w]/l0;c[w]=c[w]%10;w=ll+12;ch=n[n[MAX-l]-i-l]+48;fputcch,fp;fclosefp;printfn\n保存e,n操作完成!\n;〃导出私钥void saveskeyintd[MAXJ,int n[MAX]FILE*fp;int i;char savefile
[25],ch;”导出解密密钥存放的文件路径为:;printf d,n,scanfH%sn,savefile;printfn\nn;fp=fopensavefile,nw;fori=0;id[MAX-l];i++ch=d[d[MAX-l]-i-l]+48;fputcch,fp;;ch=fputcch,fp;fori=0;in[MAX-l];i++{ch=n[n[MAX-l]-i-l]+48;fputcch,fp;fclosefp;printfn\n保存d,n操作完成!\n/*/-----------------------------------------加密和解密的块-一void printbigstruct slink*h struct slink*p;int i;p=struct slink*mallocLEN;p=h;ifh!=NULL dofori=0;ip-bignum[M AX-1];i++printfn%dn,p-bignum[p-bignum[MAX-1]-i-1];p=p-next;whilep!=NULL;printfn\n\nn;〃对有须要的文件进行加密*/void tencryptointe[MAX],int n[MAX]/*FILE*fp;int i,k,count,temp,c;char filename
[25],ch,encryfile
[25];struct slink*p,*p1,*p2;struct slink*h;h=p=p1=p2=struct slink*mallocLEN;h=NULL;输入须要加密的文件路径;printf”\n”scanfC^s11,filename;iffp=fopenfilename,nrH==NULL printfnCannotopen file!\nH;exitO;printf\n文件的原文内容\n\nH;count=0;whilech=fgetcfp!=EOFputcharch;二c ch;k=0;ifc0把负数取正并且做一个标记*/c=absc;/*/p l-bignum[MAX-2]=O;elsep1-bignum[MAX-2]=11whilec/10!=0二temp c%10;c=c/10;p1-bignum[k]=temp;k++;pl-bignum[k]=c;pl-bignum|MAX-l]=k+1;count=count+l;ifcount==l h=pl;else p2-next=pl;;p2=plpl=struct slink*mallocLEN;p2-next=NULL;printf,\nH;fclosefp;加密后文件的保存路径//printf W;//scanfM%sn,encryfile;//fp=fopenencryfile,nwn;fp=fopenfi1ename Jw;p=pl=struct slink*mallocLEN;p=h;printfn\n加密后文件中所形成密文\n\nn;ifh!=NULL do{expmod p-bignum,e,n,pl-bignum;ch=p1-bignum[MAX-2];printfH%cn,ch;fputcch,fp;推断的是否大于十;*/if p1-bignum[MAX-1]/10==0/*/pl-bignum
[99]ch=0+48;printfn%cn,ch;fputcch,fp;ch=p1-bignum[MAX-1]+48;%printf”c”,ch;fputcch,fp;%ch=p1-bignum[M AX-1]/l0+48;printf c”,ch;fputcch,fp;ch=p1-bignum[MAX-l]%10+48;printf,%c,,ch;fputcch,fp;fori=0;ip1-bignum[MAX-1];i++printfn%dn,p l-bignum[i];ch=p l-bignum[i]+48;fputcch,fp;p=p-next;pl=struct slink*mallocLEN;}whilep!=NULL;printfn\n\nn;fclosefp;return;void tdecryptointdfMAX],int n[MAX]{FILE*fp;struct slink*h,*pl,*p2;char ch,encryfile
[25],decryfile
[25];int i,j,k,c,count,temp;printfn\n输入加密过的文件路径”;scanfn%sn,encryfile;iffp=fopenencryfile,nrH==NULL”此文件不存在!printf\n;exit0;printf\n文件中密文内容\n\nn;i=0;;j=3count=0;h=pl=p2=struct slink*mallocLEN;whilech=fgetcfp!=EOF putcharch;c=ch;ifj==3p l-bignum[MAX-2]=c;;j-}else ifj==2|二temp c-48;;}else ifj==l;p1-bignum[M AX-1]=temp*10+c-48;else ifj==0p l-bignum[i]=c-48;;i++ifi==p1-bignum[MAX-1]i=0;;j=3count+4-;;if count=l h=plelse p2-next=pl;p2=pl;pl=struct slink*mallocLEN;}p2-next=NULL;printf,,\nn;fclosefp;解密后的明文文件保存路径//printf\n//scanfn%sH,decryfile;//fp=fopendecryfile,nwn;fp=fopenencryfile,nwn;解密密文后文件中的明文:;printf”\n\n\np2=struct slink*mallocLEN;pl=h;k=0;为暂存码的值*/ifh!=NULL/*/temp ASIICint dofori=0;iMAX;i++p2-bignum[i]=0;expmod pl-bignum,d,n,p2-bignum;temp=p2-bignum
[0]+p2-bignum[l]*10+p2-bignum
[2]*100;if p2-bignum[MAX-2]==,01temp=O-temp;}/*/转化为正确的码,如形成汉字*/%ASIIC-78-96ch=temp;/*str[k]---ch*/printf写入文件c”,ch;/*str[k]―ch*/fputcch,fp;/*/str[k]—ch*/k++;pl=pl-next;p2=struct slink*mallocLEN;}while pl!=NULL;printfn\n\nn;fclosefp;return;输入明文并且返回头指针,没有加密时候转化的数字*/struct slink*inputvoid/*/struct slink*head;struct slink*pl,*p2;int i,n,c,temp;char ch;n=0;pl=p2=struct slink*mallocLEN;head=NULL;printf”\n请输入你所要加密的内容\n whilech=getchar!=\n,i=0;c=ch;ifc0c=absc;/*/把负数取正并且做一个标记*/p1-bignum[MAX-2]=10;else{p1-bignum[MAX-2]=,1*;whilec/10!=0{temp=c%10;c=c/10;p1-bignum[i]=temp;;i++pl-bignum[i]=c;p1-bignum[MAX-1]=i+1;n=n+l;ifn==l二head pl;else p2-next=pl;;P2=plpl=struct slink*mallocLEN;p2-next=NULL;returnhead;struct slink*jiamiint e[MAX],int n[MAX],structslink*headstruct slink*p;struct slink*h;struct slink*pl,*p2;int m=0,i;printfu\nn;printf加密后形成的密文内容\nH;pl=p2=struct slink*mallocLEN;h=NULL;p=head;ifhead!=NULL doexpmod p-bignum,e,n,pl-bignum;fori=0;ip1-bignum[MAX-l];i++printf%dM,p1-bignum[p1-bignum[MAX-1]-l-i];m=m+l;ifm==lh=pl;else p2-next=pl;p2=pl;pl=struct slink*mallocLEN;p=p-next;}whilep!=NULL;p2-next=NULL;p=h;printf,\nn;returnh;void jiemiintd[MAX],int n[MAX],struct slink*h{int i,j,temp;struct slinkchar ch
[65535];pl=structslink*mallocLEN;p=h;j=0;ifh!=NULL dofori=0;iMAX;i++pl-bignum|i]=O;expmodp-bignum,d,n,pl-bignum;temp=p1-bignum
[0]+p1-bignum
[1]*10+pl-bignum
[12]=k;len=12+l;else len=12;c
[99]=len;return;voidsubintal[MAX],inta2[MAX],int*c{inti,ll,12;int Ien,tl[MAX],t2[MAX];int k=0;ll=al[MAX-l];12=a2[MAX-l];ifal[MAX-2]==,-a2[MAX-2]==!-moval,tl;mova2,t2;tl[MAX-2]=0;t2[MAX-2]=0;subt2,tl,c;return;else ifa2[MAX-2]=,-!mova2,t2;t2[MAX-2]=0;addal,t2,c;return;else ifal[MAX-2]==-mova2,t2;t2[MAX-2]=-f;addal,t2,c;return;ifcmpal,a2==llen=12;fori=0;ilen;i++ifal[i]-k-a2[i]0c[i]=al[i]-a2[i]-k+10%10;k=l;elsec[i]=al[i]-a2[i]-k%10;k=0;fori=len;il1;i++ifal[i]-k0c[i]=al[i]-k+10%10;k=l;elsek=0;使得数组中的前面所以字符不显示了,如显示为了ifc[ll-l]==O/*C01000-20=0980—980*/len=ll-l;i=2;消退后变成了;while c[l1-i]==0/*111456-111450=00006,06*/{len=ll-i;;i++elselen=ll;elseifcmpa1,a2==-lc[MAX-2]=!-;len=ll;fori=0;ilen;i++ifa2[i]-k-al[i]0c[i]=a2[i]-al[i]-k+10%10;k=l;else{c[i]=a2[i]-al[i]-k%10;k=0;}fori=len;i12;i++{ifa2[i]-k0c[i]=a2[i]-k+10%10;k=l;elsec[i]=a2[i]-k%10;k=0;ifc[12-l]=0len=12-l;i=2;while c[ll-i]=O len=ll-i;;i++}else len=12;else ifcmpal,a2==0len=l;c[len-l]=0;c[MAX-l]=len;return;〃留意经检验知道此处和的数组都void modinta[MAX],int b[MAX],int*c/*/c=a mod b AC变更了*/{intd[MAX];;mov a,dwhile cmpd,b!=-1/*/c=a-b-b-b-b-b......untilcb*/subd,b,c;复制给movc,d;/*/c a*/return;〃试商法〃调用以后为为void divtintt[MAX],int b[MAX],int*c,int*w/*w amodb,C adiv b;*/用于短暂保存数据*/intal,b1,i,j,m;/*wint d[M AX],e[M AX],f[M AX],g[M AX],a[M AX];movt,a;fori=0;iMAX;i++e[i]=0;fori=0;iMAX;i++d[i]=0;fori=0;iMAX;i++g[i]=0;al=a[MAX-l];bl=b[MAX-l];if cmpa,b==-l c
[0]=0;c[MAX-l]=l;movt,w;return;else ifcmpa,b==0c
[0]=l;c[MAX-l]=l;w
[0]=0;w[MAX-l]=l;return;m=al-bl;fori=m;i=0;i-/*341245/3=341245-300000*1—41245-30000*1—11245-3000*3—2245-300*7---145-30*4=25--25-3*8=1*/forj=0;jMAX;j++d[j]=O;;d[i]=ld[MAX-l]=i+l;movb,g;mulg,d,e;while cmpa,e!=-l{;c[i]++;suba,e,f复制给movf,a;/*f g*/高位清零*/forj=i;jMAX;j++/*e[j]=O;mova,w;ifc[m]==O c[MAX-l]=m;else c[MAX-l]=m+1;return;解决了void mulmodinta[MAX],int b[MAX],int n[MAX],int*m/*m=a*b modn;*/int c[MAX],d[MAX];inti;fori=0;iMAX;i++d[i]=c[i]=0;mula,b,c;divtc,n,d,m;fori=0;im[MAX-1];i++printfH%dn,m[m[MAX-1]-i-1];printfu\nm lengthis:%d\nH,m[MAX-l];/*接下来的重点任务是要着手解决m=aAp modn的函数问题*/void expmodinta[MAX],int p[MAX],int n[MAX],int*m放入放入;intt[MAX],l[MAX],temp[MAX];/*/t2,11*/;intw[MAX|,s[MAXLc[MAX],b[MAX],ifori=0;iMAX-l;i++b[i]=l[i]=t[i]=w[i]=O;t
[0]=2;t[MAX-l]=l;1[O]=1;1[MAX-1]=1;movl,temp;mova,m;。