[ 永远的UNIX::UNIX技术资料的宝库 ]

首页 > 编程技术 > 源码天堂 > 正文

RSA加密实例分析

来源:本文出自: 作者: (2001-07-06 21:04:01)


    现在网上有的大部分都是理论,这里将给出一个简单加密模块的全部源程序(源代码)

至于RSA的理论网上一大把,它是基于公钥加密体制的一种算法。这个实例主要是用来将某一重要文件绑定到一个IP地址上。
把它拷贝下来,存为CODE.C,然后执行

         GCC –O CODE CODE.C

          然后用./ CODE E [IP ADDRESS] [FILENAME]对文件进行加密。或用

./CODE D [IP ADDRESS] 进行解密整个过程中产生了两个中间文件,至于什么文件,你去试一试就知道啦!

#include "stdio.h" 

#include "string.h"   

int e,d=1,n;   

 main(int argc,char *argv[]) 



int ip,fai,p=43,q=59,ch1,i=0,j=0,edch,dech=0; 

char *num,*cha,ch,*file={"index.html"}; 

FILE *fp,*fp2;   

if (argc<2) 



    printf("paramater error!"); 

    exit(0); 



if (argc>3) 

 { 

   file=argv[3]; 

 }   

//printf("%s,",file)  

e=iptoint(argv[2]); 

//printf("%s,%s",argv[1],argv[2]); 

switch (*argv[1]) 



case 'e': 

   //printf("e=%d",e); 

  if ((fp2=fopen("encode.htm","w+"))==NULL) 

  { 

     printf("can't open file"); 

     exit(0); 

  } 

"code.c" 199L, 3571C 

  } 

  n=p*q;fai=(p-1)*(q-1); 

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

  { 

     printf("can't open giving file"); 

     exit(0); 

  } 

  else 

  { 

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

    { 

         edch=fmod(ch1,e,n); 

         if (edch>0 && edch<10) 

         {     fprintf(fp2,"%s","000"); fprintf(fp2,"%d",edch); 

         } 

         else if (edch<100 && edch>10) 

         {     fprintf(fp2,"%s","00"); fprintf(fp2,"%d",edch); 

         } 

         else if (edch<1000 && edch>100) 

         {     fprintf(fp2,"%s","0"); fprintf(fp2,"%d",edch); 

         } 

         else if (edch<10000 && edch>1000) 

         {     fprintf(fp2,"%d",edch); 

         } 

         else 

               fputc('\n',fp2); 

    } 

  } 

  close(fp); 

  close(fp2); 

  break; 

case 'd': 

 // printf("d=%d",e); 

  if ((fp2=fopen("decode.html","w+"))==NULL) 

  { 

  if ((fp2=fopen("decode.html","w+"))==NULL) 

  { 

     printf("can't open file"); 

     exit(0); 

  } 

  n=p*q;fai=(p-1)*(q-1); 

  while(((d*e)%fai)!=1) 

     d++; 

  if((fp=fopen("encode.htm","r"))==NULL) 

  { 

      printf("can't open file"); 

      exit(0); 

  } 

  else 

  {  i=0; 

   //  printf("e=%d,d=%d,n=%d,",e,d,n); 

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

     { 

        if (i==4) 

        { 

           //dech=((int)num[0])*1000+((int)num[1])*100+((int)num[2])*10+(int)num[3]; 

           //printf("yuan=%d,",dech); 

           dech=fmod(dech,d,n); 

           //printf("new=%d,",dech); 

           fprintf(fp2,"%c",dech); 

           i=0; 

           dech=0; 

           // 

         } 

         switch (ch) 

         { 

            case '9':dech=dech*10+9;break; 

            case '1':dech=dech*10+1;break; 

            case '2':dech=dech*10+2;break; 

            case '3':dech=dech*10+3;break; 

            case '4':dech=dech*10+4;break; 

            case '3':dech=dech*10+3;break; 

            case '4':dech=dech*10+4;break; 

            case '5':dech=dech*10+5;break; 

            case '6':dech=dech*10+6;break; 

            case '7':dech=dech*10+7;break; 

            case '8':dech=dech*10+8;break; 

            default:dech=dech*10;   

         } 

        // printf("dech=%d,",dech); 

         num[i]=ch; 

         i++;   

     } 

      dech=fmod(dech,d,n); 

      fprintf(fp2,"%c",dech); 

  } 

  close(fp); 

  close(fp2); 

  break; 

default: 

   printf("Usage:code [option]...[Ip Address]...\n"); 

   printf("List information about the option\n"); 

   printf("e   bind ip address to index.html\n"); 

   printf("d   decode from the encodeing file to index2.html"); 

}   



int iptoint(ip) 

char *ip; 



int i,ei=0,len; 

int prime=0;   

len=strlen(ip);   

len=strlen(ip); 

for(i=0;i


      if(ip[i]>'0' && ip[i]<'9') 

      ei=ei+i*((int)ip[i]); 



ei=ei/1000+(ei/100)%10+(ei/10)%10+ei%10; 

//printf("%d",ei); 

//len=ei/2; 

//while(prime==0) 

//indent: Standard input:2: Error:Unexpected end of file 

while (((ei % 2)== 0) || ((ei % 3) == 0)) 

{   ei=ei+1; 



/*    prime=1; 

    for (i=0;i
    { 

        if((ei%i)==0) 

        { 

            ei--; 

            prime=0; 

            break; 

        }   

     } 

}*/ 

return(ei);   

}   

int fmod(x, r, p) 

int x,r,p; 



int a,b,c=1; 

a=x;b=r; 

while (b!=0) 



   while ((b%2)==0) 

   { 

      b=b/2;a=(a*a)%p; 

   } 

   b=b-1;c=(a*c)%p; 



return c; 

}
 


(http://www.fanqiang.com)



 
 相关文章

★  感谢所有的作者为我们学习技术知识提供了一条捷径  ★
www.fanqiang.com