当前位置:Linux教程 - Linux - RSA加密实例分析

RSA加密实例分析



        

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

    至于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 open file");

    exit(0);

    }

    "code.c" 199L, 3571C

    }

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

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

    {

    printf("can 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(\ ,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 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 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<len;i++)

    {

    if(ip[i]> && 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<ei;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;

    }

    摘自:泡吧
    发布人:netbull 来自:非常Linux