rsa加密解密算法C語(yǔ)言代碼_第1頁(yè)
rsa加密解密算法C語(yǔ)言代碼_第2頁(yè)
rsa加密解密算法C語(yǔ)言代碼_第3頁(yè)
rsa加密解密算法C語(yǔ)言代碼_第4頁(yè)
rsa加密解密算法C語(yǔ)言代碼_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

#includc<stdio.h>

#include<string.h>

#includc<stdlib.h>

#include<time.h>

#include<math.h>

#include<malloc.h>

#defineMAX100

#defineLENsizeof(structslink)

voidsub(intafMAXLintb[MAX],intc[MAX]);

structslink

(

inibignum[MAX];

/*bignum[98]用來(lái)標(biāo)記正負(fù)號(hào),1正,0負(fù)bignum[99]來(lái)標(biāo)記實(shí)際長(zhǎng)度*/

structslink*next;

};

/*/---------------------------自己建立的大數(shù)運(yùn)算庫(kù)--------------------------*/

voidprint(inta[MAX])

(

inti;

for(i=0;i<af99];i++)

printf("%d",a|a[99]-i-l]);

printf("\n\nu);

return;

intcmp(intal[MAX],inta2[MAX])

{int11,12;

inti;

ll=al[99];

I2=a2[99];

if(132)

returnI;

if(llv⑵

return-1;

for(i=(lI-l);i>=0;i—)

(

if(al[i]>a2[il)

return1;

if(al[i]<a2[i])

return-1;

return0;

I

voidmov(inta[MAX],int*b)

(

intj;

for(j=0;j<MAX;j-+)

bfjl=a[jl;

return;

voidmul(intal[MAX],inta2[MAX],int*c)

(

intij;

inty;

intx;

intz;

intw;

int11,12;

ll=aI[MAX-l];

12=a2[MAX-l];

if(al[MAX-2]=='-'&&a2(MAX-2]==,-')

c[MAX-2]=0;

elseif(al[MAX-2]==,-')

c[MAX-2]='-';

elseif(a2[MAX-2]=='-')

c[MAX-21;

for(i=0;i<li;i++)

(

for(j=0;j<12;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+clw]/l0;

c[w]=c[w]%10;

w=ll+12;

if(c[w-l]==O)w=w-l;

c[MAX-l]=w;

return;

voidadd(intallMAX],inta2lMAX],int*c)

(

inti,II,12;

intlen,temp[MAX];

intk=0;

ll=al[MAX-l];

12=a2[MAX-l];

if((al[MAX.2]==)&&(a2[MAX?2]==u))

(

c[MAX-21='-';

)

elseif(al[MAX-2]==,-')

(

mov(al,temp);

temp[MAX-2]=0;

sub(a2,temp,c);

return;

)

elseif(a2[MAX-2]==,-')

(

mov(a2,temp);

temp[98]=0;

sub(aI,(emp,c);

return;

)

if(ll<12)len=ll;

elselen=12;

for(i=0;i<len;i++)

c[i]=(al[i]+a2[i]+k)%10;

k=(allij+a2lij+k)/l();

)

if(ll>len)

(

for(i=len;i<l1;i++)

c[i]=(al[i]+k)%10;

elseif(a2[MAX-2]=='-')

{

mov(a2,t2);

(2[MAX-2]=0;

add(al,t2,c);

retuni;

)

elseif(al[MAX-2J==*-')

|

mov(a2,t2);

l2[MAX-2]=',;

add(al,t2,c);

return;

}

if(cmp(al,a2)==l)

{

len=12;

for(i=0;i<len;i++)

{

if((al[i]-k-a2[i])<0)

{

c[iJ=(al[i]-a2[iJ-k+10)%10;

k=l;

)

else

(

c[i]=(al[i]-a2[i]-k)%10;

k=0;

for(i=len;i<ll;i++)

{

if((al[i]-k)<0)

c[il=(al[i]-k+10)%10;

k=l;

else

c[il=(al[i]-k)%10;

k=0;

if(c[ll-l]==O)/*使得數(shù)組C中的前面所以0字符不顯示了,如1000-20=0980—>顯示為980

了切

{

len=Il-l;

i=2;

while(c[ll-il==O)/*l11456-111450=00006,消退0后變成了6:*/

(

len=ll-i;

i++;

else

{

len=ll;

)

)

else

if(cmp(a1,a2)=(-1))

(

c[MAX-2]='-';

len=ll;

for(i=0;i<len;i++)

(

if((a2[i]-k-al[iJ)<0)

(

clij=(a2[i]-al[iJ-k+10)%10;

k=l;

)

else

{

c[i]=(a2[i]-al[i]-k)%IO;

k=0;

for(i=lcn;i<12;i++)

(

if((a2[i]-k)<0)

c[i]=(a2[i]-k+10)%1Q;

k=l;

else

(

c[i]=(a2[i]-k)%10;

k=0;

)

1

if(c[12-l]==0)

{

len=12-l;

i=2;

while(c[ll-i]==O)

(

len=ll-i;

i++;

}

1

elselen=12;

elseif(cmp(al,a2)==0)

(

len=l;

c[len-l]=O;

)

c[MAX-l]=len;

return;

voidmod(inta[MAX],intb[MAX],int*c)/*/c=amodb〃留意:經(jīng)檢驗(yàn)知道此處A和C的數(shù)

組都變更了。*/

{inid[MAX];

mov(a,d);

while(cmp(d,b)!=(-1))/*/c=a-b-b-b-b-b......until(c<b)*/

(

sub(d,b,c);

mov(c,d);/*/c復(fù)制給a*/

}

return;

voiddivt(intt[MAX],intb|MAX],int*cJnt試商法〃調(diào)用以后w為amodb,C為a

divb;*Z

intal,bl,i,j,m;/*w用于短暫保存數(shù)據(jù)*/

intdlMAXJ,elMAX],flMAX],g[MAX],alMAX];

mov(t,a);

for(i=0;i<MAX:i-+)

e[i]=0;

fbr(i=O;i<MAX;i++)

d[i]=0;

for(i=0;i<MAX;i++)g[iJ=O;

al=a[MAX-l];

bl=b[MAX-l];

if(cmp(a.b)==(-l))

{

c[0]=0;

c[MAX-l]=l;

inov(t,w);

return;

)

elseif(cmp(a,b)==0)

{

c[O]=I;

c[MAX-l]=l;

w[0]=0;

w[MAX-l]=l;

return;

1

m=(al-bl);

for(i=m;i>=0;i-)/*341245/3=341245-300000*I—>41245-30000*1-->11245-3000*3—>2245-30

0*7—>145-30*4=25—>25-3*8=I*/

{

for(j=0;j<MAX;j++)

dfjl=O;

d[i]=l;

d[MAX-l]=i+l;

mov(b,g);

mul(g,d,e);

while(cmp(a,e)!=(-l))

(

c[i]++;

sub(a,e,f);

mov(f,a);/*f復(fù)制給g*/

)

for(j=i;jvMAX;j++)戶高位清零列

e[j]=O;

I

mov(a,w);

if(c[m]==O)c[MAX-l]=m;

elsec[MAX-l]=m+1;

return;

}

voidmulmod(inta[MAX],intb[MAX],intn[MAX],int*m)/*解決了m=a*bmodn;*/

(

intc[MAXJ,d[MAX];

inti;

for(i=0;i<MAX;i++)

d[i]=c[i]=O;

mul(a,b,c);

divt(c,n,d,m);

for(i=0;i<m[MAX-1];i++)

printf("%d",m[m[MAX-1]-i-1]);

printf("\nmlengthis:%d\n",m[MAX-l]);

)

/*接下來(lái)的重點(diǎn)任務(wù)是要著手解決mF、modn的函數(shù)問(wèn)題。*/

voidexpmod(inta[MAX].intp[MAX],intn[MAX].int*m)

{

intw[MAXJ,s[MAXJ,c[MAX],blMAX],i;

for(i=0;i<MAX-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;

mov(l,temp);

mov(a,m);

mov(p,b);

while(cnip(b,l)!=O)

(

for(i=0;i<MAX;i++)

w[i]=c[i]=O;

divt(b,t,w,c);/*//c=pmod2w=p/2*/

niov(w,b);/*//p=p/2*/

if(cmp(c,l)==0)/*/余數(shù)c==1*/

|

for(i=0;i<MAX;i++)

w[i]=0;

mul(tcmp,m,vv);

mov(wjenip);

for(i=0;i<MAX;i++)

w[i]=c[i]=0;

divt(tcmp,n,w,c);/*/c為余c=tcmp%n,w為商w=temp/n*/

mov(c,temp);

)

for(i=0;i<MAX;i++)

s[i]=0;

mul(m,m,s);//s=a*a

for(i=0;i<MAX;i++)

c[i]=0;

divt(s,n,w.c);/*/w=s/n;c=smodn*/

mov(c,m);

for(i=0;i<MAX;i++)

s[i]=0;

mul(m,temp,s);

for(i=0;i<MAX;i++)

c[i]=O;

divt(s,n,w,c);

mov(c,m);/*余數(shù)s給m*/

m[MAX-2]=a|MAX-2];/*為后面的漢字顯示須要,用第99位做為標(biāo)記*/

return;

/*/k=temp*k%n;*/

intis_prime_san(intp[MAX])

inti,a[MAX],t[MAX],s(MAX],o[MAX];

for(i=0;i<MAX;i++)

s[i]=o|i]=ali]=t[i]=0;

t[MAX-l]=l;

a[0]=2;/Z{2,3,5,7)

a[MAX-l]=l;

sub(p,t,s);

expmod(a,s,p,o);

if(cnip(o,t)!=0)

(

return0:

a[0]=3;

for(i=0;i<MAX;i++)o[i]=O;

expmod(a,s,p,o);

if(cnip(o,t)!=0)

return0;

a[0j=5;

for(i=0;i<MAX;i++)o[i]=0;

expmod(a,s,p,o);

if(cmp(o,t)!=0)

(

return0;

a[0]=7;

for(i=0;i<MAX;i++)o[i]=0;

expmod(a,s,p,o);

if(cmp(o,t)!=0)

(

return0;

}

return1;

inicoprime(inte[MAX],ints[MAX])/*////求兩個(gè)大數(shù)之間是否互質(zhì)〃〃*/

(

inta[MAX],b[MAX],c[MAX],d[MAX],o[MAX],l[MAX];

inti;

for(i=0;i<MAX;i++)

l[i]=o[i]=c[i]=d[i]=0;

o[0]=0;o[MAX-l]=l;

l[0]=l;i[MAX-l]=l;

mov(e,b);

mov(s.a);

do

(

if(cmp(b,l)=0)

(

return1;

for(i=0;i<MAX;i++)

c[i]=O;

divt(a,b,d,c);

mov(b,a);/*b—>a*/

mov(c,b);/*c->b*/

|while(cmp(c,o)!=0);

/*printf("Iheyarenotcoprime!\nH);*/

return0;

}

voidprime_random(int*pjnt*q)

(

inti.k;

t;

pfO]=l;

qlOJ=3;

//p[19]=l;

//q[18]=2;

p[MAX-lJ=IO;

q[MAX-l]=ll;

do

(

t=time(NULL);

srand((unsignedlong)t);

for(i=1;i<p[MAX-1]-l;i++)

|

k=rand()%10;

p[i]=k;

)

k=rand()%10;

while(k==0)

{

k=rand()%I();

)

p[p[MAX-l]-l]=k;

}while((is_prime_san(p))!=1);

prinif(”素?cái)?shù)p為:");

for(i=0;i<p[MAX-l];k+)

printf("%d';p[p[MAX-l]-i-l]);

printf("\n\n");

do

(

t=time(NULL);

srand((unsignedlong)t);

fbr(i=1;i<q[MAX-1];i++)

{

k=rand()%10;

q[i]=k;

I

}while((is_prime_san(q))!=1);

printf("素?cái)?shù)q為:");

for(i=O;i<q[MAX-l];i++)

{

printf("%d",q[q[MAX-1]-i-1]);

)

printf("\n\n");

return;

voiderand(inte[MAX],intm[MAX])

(

inti,k;

time_tt;

e[MAX-l]=5;

printf("隨機(jī)產(chǎn)生一個(gè)與(p-l)*(q-l)互素的e

do

(

t=time(NULL);

srand((unsignedlong)t);

for(i=0;i<e[MAX-l]-l;i++)

{

k=rand()%10;

e[i]=k;

)

while((k=rand()%10)=0)

k=rand()%IO;

e[e[MAX-l]-l]=k;

}while(coprime(e,m)!=l);

for(i=0;i<e[MAX-1];i++)

printf("%d",e[e[MAX-1]-i-1]);

1

printf("\n\n");

return;

)

voidrsad(inte[MAX],intglMAXJJnt*d)

(

intr[MAXJ,n1[MAX],n2[MAX],k[MAX],w[MAX]:

inii,t[MAX],bi[MAXLb2(MAXLtemp[MAX];

mov(g,n1);

mov(e,n2);

for(i=0;i<MAX;i++)

k[i]=w[i]=r[i]=ternp[i]=bI[i]=b2[iJ=t[i]=0;

bl[MAX-l]=0;bl[0]=0;/*/b1=0;*/

h2lMAX-l]=1;b2[0]=1;/*/b2=1;*/

while⑴

{

for(i=0;i<MAX;i++)

k[i]=w[i]=0;

divt(n1,n2,k,w);/*/k=n1/n2;*/

for(i=0;i<MAX;i++)

temp[i]=0:

mul(k,n2,temp);/*/temp=k*n2;*/

for(i=0;i<MAX;i++)

r[i]=0;

sub(nI,tempi);

if((r[MAX-lj==l)&&(r[O]==O))/*/r=O*/

(

break;

)

else

{

mov(n2,nl);/*/nl=n2;*/

mov(r,n2);/*/n2=r;*/

mov(b2,l);/*/t=b2;*/

for(i=0;i<MAX;i++)

temp[i]=0;

mul(k,b2,temp);/*/b2=b1-k*b2;*/

for(i=0;i<MAX;i++)

b2[i]=0;

sub(bl,tcnip.b2);

mov(t.bl);

for(i=0;i<MAX;i++)

t[i]=0;

add(b2,g,t);

fbr(i=O;i<MAX;i++)

tcmp[iJ=dli]=O;

divl(t,g.temp,d);

primf("由以上的(p?D*(q?l)和e計(jì)算得出的d:");

for(i=0;i<d[MAX-l];i++)

printf("%d,\d[dIMAX-11-i-l]);

printf("\n\n");

unsignedlongrsa(unsignedlongp,unsignedlongq,unsignedlonge)/*/求解密密鑰d的函數(shù)

(依據(jù)Euclid算法)*/

(

unsignedlongg,k,r,nl,n2,t;

unsignedlongbI=0,b2=I;

g=(p-l)*(q-D;

nl=g;

n2=e;

while(l)

k=nl/n2;

r=nl-k*n2;

if(r!=O)

{

nl=n2;

n2=r;

t=b2;

b2=bl-k*b2;

bl=t;

)

else

break;

return(g+b2)%g;

)

/*/-----------------------------導(dǎo)入導(dǎo)出公鑰和私鑰一

voidloadpkey(inte[MAX],intn[MAX])〃導(dǎo)入公鑰

|

FILE*fp;

charfilename[25],str[MAX],ch;

inti,k;

for(i=0;i<MAX;i++)

cri]=n[il=O;

while(l)

(

printf("\n");

prindT為導(dǎo)入(e,n),請(qǐng)輸入加密密鑰對(duì)文件路徑:\n");

scanf("%s",filename);

if((fp=fopcn(filcnamc,"r"))==NULL)

prinlf("輸入的文件不存在,請(qǐng)重新輸入!\n)

elsebreak;

}

k=0;

while((ch=fgetc(fp))!=EOF)

{

if(ch!='r)

(

str(k]=ch;

k++;

)

else

{

for(i=0;i<k;i++)

{

e[i]=str[k-i-l]-48;

)

e[MAX-l]=k;

k=0;

for(i=0;i<k;i++)

n[i]=str(k-i-l]-48:

n[MAX-l]=k;

printfC'Vn加密密鑰e:");

for(i=0;i<e[MAX-IJ;i++)

printf("%d”,乖[MAX-1]-i-1]);

printfCAn");

printfC'Xn公鑰n:");

fbr(i=O;i<n[MAX-l];i++)

printf("%d,r,n[n[MAX-1]-i-1]);

printf("\n");

lclose(fp);

printf("\n導(dǎo)入(e,n)勝利!\n");

getchar();

}

voidloadskcy(intd[MAX],intn[MAX])〃導(dǎo)入私鑰

(

(

FILE*fp;

charfilename[25],str[MAX],ch;

inti,k;

for(i=0;i<MAX;i++)

d(i]=n[il=O;

while(l)

(

printf("為導(dǎo)入(d,n),請(qǐng)輸入解密密鑰對(duì)文件的路徑:\n");

scanf("%s",filename);

if((fp=fopen(filename,"r"))==NULL)

(

prinlf(“輸入的文件不存在,請(qǐng)重新輸入!\n");

}

elsebreak;

}

k=0;

while((ch=fgetc(fp))!=EOF)

(

if(ch!='')

(

str[k]=ch;

k++;

else

for(i=0;i<k;i++)

(

d[i]=str[k-i-l]-48;

)

d[MAX-lj=k;

k=0;

)

for(i=0;i<k;i++)

nfi]=str[k-i-11-48;

n[MAX-l]=k;

printf("\n解密密鑰d:");

for(i=0;i<d|MAX-l];i++)

printf("%d”,d[d[MAX-1卜i-1]);

printfC'Xn");

printf("\n公鑰n:");

for(i=0;i<n[MAX-1];i++)

printf("%d",n[n(MAX-1]-i-1]);

printf("\n");

fclose(fp);

printf(u\n導(dǎo)入(d,n)勝利!\n");

getchar();

voidsavepkey(inie|MAX],intn[MAX「)〃導(dǎo)出公鑰

(

FILE*fp:

inti;

charsavefile[25],ch;

primf("導(dǎo)出加密密鑰(e,n),存放的文件路徑為:");

scanf("%s",savefile);

printf("\n");

fp=fopenCsavefile/'w'*);

fbr(i=O;i<e[MAX-l];i++)

(

ch=e[e[MAX-l]-i-l]+48;

fputc(ch.fp);

ch='

fputc(ch.fp);

fbr(i=O;i<n[MAX-l];i++)

ch=n|n[MAX-l]-i-l]+48;

fputc(ch.fp);

fclose(fp);

printf("\n保存(e,n)操作完成!\n");

)

voidsaveskey(intd[MAXJ,intn[MAX])〃導(dǎo)出私鑰

(

FILE*fp;

inti;

charsavefile[25],ch:

printf("導(dǎo)出解密密鑰(dm),存放的文件路徑為:");

scanf("%s",savefile);

printf("\n");

fp=fopen(savefile,"w");

for(i=0;i<d[MAX-l];i++)

{

ch=d[d[MAX-l]-i-l]+48;

fputc(ch,fp);

)

ch-

fputc(ch.fp);

for(i=0;i<n[MAX-l];i++)

{

ch=n[n[MAX-l]-i-l]+48;

fpuic(ch,fp);

}

fclose(fp);

printf("\n保存(d,n)操作完成!\n");

/*/.............................加密和解密的塊........................./*/

voidprintbig(structslink*h)

(

structslink*p;

inti;

p=(slructslink*)malloc(LEN);

p=h;

if(h!=NULL)

do

for(i=0;i<p->bignum[MAX-i];i++)

printf(',%d",p->bignum[p->bignum[MAX-1]-i-1J);

p=p->next;

}

while(p!=NULL);

printf("\n\n");

voidtencrypto(inte[MAX],intn[MAX])/*〃對(duì)有須要的文件進(jìn)行加密*/

|

FILE*fp;

inti,k,count,temp,c;

charfilenamef251,ch,encryfile[25];

structslink*p,*pl,*p2;

structslink*h;

h=p=p1=p2=(structslink*)malloc(LEN);

h=NULL;

printf("\n輸入須要加密的文件路徑:");

scanf(,'%su,filename);

if((fp=fopen(filename,"r"))==NULL)

(

printf("Cannotopenfile!\n");

exit(O);

)

printf("\n文件的原文內(nèi)容:\n\n");

count=0;

while((ch=fgetc(fp))!=EOF)

(

putchar(ch);

c=ch;

k=0;

if(c<0)

{

c=abs(c);/*/把負(fù)數(shù)取正并且做一個(gè)標(biāo)記*/

pl->bignum[MAX-2]='O';

)

else

pl->bignum[MAX-2]-1*;

)

while(c/l()!=O)

tcmp=c%10;

c=c/10;

p1->bignum[k]=temp;

k++;

)

pl->bignum[k]=c;

pI-^bignumfMAX-1l=k+1;

count=count+1;

if(count==l)

h=pl;

elsep2->next=pl;

P2=pl;

pI=(structslink*)inalloc(LEN);

)

p2->next=NULL;

printf("\n^^);

fclose(fp);

//printf("加密后文件的保存路徑八n”);

//scanf("%s'\encryfile);

//fp=fopen(encryfile,"w");

fp=fopcn(filcnaine,"w");

p=pl=(structslink*)malloc(LEN);

p=h;

prinif("\n加密后文件中所形成密文:\n\n");

if(h!=NULL)

do

{

expmod(p->bignum,e,n,pl->bignum);

ch=pl->bignum[MAX-2];

printf("%cH,ch);

fputc(chjp);

if((pl?>bignum[MAX-l]/10)==0)/*/推斷pl->bignum[99]的是否大于十;*/

{

ch=0+48;

printf("%c",ch);

fputc(ch.fp);

ch=p1->bignum[MAX-1]+48;

prinlf("%c",ch);

fputc(ch,fp);

else

ch=pl->bignum[MAX-1]/10+48;

printf("%c”,ch);

fpulc(ch,fp);

ch=p1->bignum[MAX-1]%10+48;

printf("%c",ch);

fputc(ch,fp);

for(i=0;i<p1->bignumlMAX-1];i++)

(

printf("%d'\p1->bignum[i]);

ch=pI->bignum[i]+48;

fputc(ch,fp);

)

p=p->next:

pl=(structslink?)malloc(LEN);

}whilc(p!=NULL);

printf("\n\n");

fclose(fp);

return;

)

voidtdccrypto(in(d[MAX],intn[MAXJ)

(

FILE亭fp;

structslink*h,*pl,*p2;

charch,encryfilel25],decryfile[25J;

inti,j,k,c,count,temp;

printf(n\n輸入加密過(guò)的文件路徑:");

scanf("%s",encryfile);

if((fp=fopen(cncryfile,"r"))==NULL)

{

printf("此文件不存在!\n");

exit(O);

)

printf("\n文件中密文內(nèi)容:\n\n");

i=0;

j=3;

count=0;

h=pl=p2=(structslink*)malloc(LEN);

while((ch=fgetc(fp))!=EOF)

putchar(ch);

c=ch;

if(j==3)

(

pI->bignum[MAX-2]=c;

j-;

)

elseif(j==2)

|

(emp=c-48;

卜;

)

elseif(j==D

(

p1->bignum[MAX-l]=temp:}:l0+c-48;

j-;

)

elseif(j==0)

(

pI->bignum[i]=c-48;

i++;

if(i==p1->bignum[MAX-1])

{

i=0;

j=3;

count++;

if(count==1)

h=pl;

elsep2->next=pl;

p2=pl;

p1=(structslink*)malloc(LEN);

)

)

)

p2->next=NULL;

printf("\n");

fclose(fp);

//prinif("解密后的明文文件保存路徑:\n");

//scanf("%s",decryfile);

//fp=fopen(decryfile,"w");

fp=fopen(encryfile,"w");

printf("\n解密密文后文件中的明文:\n\n");

p2=(structslink*)malloc(LEN);

pl=h;

k=0;

if(h!=NULL)/*/temp為暫存ASIIC碼的int值*/

do

{

for(i=0;i<MAX;i++)

p2-、bignum[i]=0;

expmod(pl->hignum,d,n,p2->bignum);

temp=p2->bignum|0]+p2->bignum[11*10+p2->bignum[21*100;

if((p2->bignum[MAX-2])=='0')

(

temp=0-temp;

}/*/轉(zhuǎn)化為正確的ASIIC碼,如-78-96形成漢字*/

ch=temp;/*str[k]—>ch*/

printf(',%c'\ch);/*str[k]—>ch*/

fputc(ch.fp);/*/寫(xiě)入文件str(kl--->ch*/

k++;

pl=pl->next;

p2=(structslink*)malloc(LEN);

}while(pl!=NULL);

printf("\n\n");

fclosc(fp);

return;

structslink*input(void)/*/輸入明文并且返回頭指針,沒(méi)有加密時(shí)候轉(zhuǎn)化的數(shù)字*/

(

structslink*head;

structslink*pl,*p2;

inti,n,c,temp;

charch;

n=0;

pl=p2=(structslink*)malloc(LEN);

head=NULL;

printf(”\n請(qǐng)輸入你所要加密的內(nèi)容:\n");

while((ch=getchar())!='\n')

(

i=0;

c=ch;

if(c<0)

c=abs(c);/*/把負(fù)數(shù)取正并且做一個(gè)標(biāo)記*/

p1->bignum[MAX-2]-0*;

)

else

(

p1->bignum[MAX-2]='r;

)

while(c/10!=0)

{

lemp=c%10;

c=c/10;

pI->bignum|i]=temp;

i++;

I

pl->bignum[i]=c;

pI->bignum[MAX-1J=i+1;

n=n+l;

if(n==l)

head=pI;

elsep2->next=pl;

P2=pl;

pl=(structslink*)malloc(LEN);

)

p2->next=NULL;

return(head);

structslink*jiami(inte[MAX],intn[MAX],structslink*head)

(

structslink*p;

structslink*h;

structslink*pl,*p2;

intm=0,i;

printfCVn'1);

printf("加密后形成的密文內(nèi)容:\n");

pl=p2=(structslink*)malloc(LEN);

h二NULL;

p=head;

if(head!=NULL)

do

expmod(p->bignum,e.n,pl->bignum);

for(i=0;i<pl->bignum[MAX-l];i++)

{

printf("%d",p1->bignum[pI->bignum[MAX-1]-1-i]);

}

m=m+l;

if(m==l)

h=pl;

elsep2->next=pl;

p2=pl;

pl=(structslink*)malloc(LEN);

p=p->next;

}while(p!=NULL);

p2->next=NULL;

p=h;

printfC'Xn");

return(h);

voidjiemi(intd[MAX].intr.[MAX],structslink*h)

(

in(i,j,lemp;

structslink

charch[65535];

pl=(structslink*)malloc(LEN);

p=h;

j=0;

if(h!=NULL)

do

{

for(i=0;i<MAX;i-+)

pl->bignum[iJ=O;

expmod(p->bignum,d,n,pl->bignum);

temp=pl->bignum[O]+p1->bignuni[l]*l0+p1->bignum[2]*100;

if((pI->bignum[MAX-2])=='O')

tcmp=O-tcnip;

ch[j]=temp;

j++;

p=p->next;

(while(p!=NULL);

printf("\n");

printf("解密留文后所生成的明文

for(i=0;i<j;i++)

prinlf("%c”,ch[i]);

printf("\n");

return;

voidmcnu()

(

printf("\n\n\n");

printf("\n\n\n");

printf("R-------產(chǎn)生密鑰對(duì)\n\n\n");

printf("S-------保存密鑰對(duì)\n\n\n");

printf("L-------載入密鑰對(duì)\n\n\n*');

printfCE-------對(duì)文件加密\n\n\n");

printf("D.......對(duì)文件解密\n\n\n**);

printfC'

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論