home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 247_01 / decode.c < prev    next >
Text File  |  1989-04-19  |  2KB  |  90 lines

  1. /*
  2.  *   Program to decode message using RSA private key.
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include "miracl.h"
  7.  
  8. void strip(name)
  9. char name[];
  10. { /* strip extension off filename */
  11.     int i;
  12.     for (i=0;name[i]!='\0';i++)
  13.     {
  14.         if (name[i]!='.') continue;
  15.         name[i]='\0';
  16.         break;
  17.     }
  18. }
  19.  
  20. main()
  21. {  /*  decode using private key  */
  22.     big e,e1,e2,m,ke,kd,p,q,c,mn,mx;
  23.     FILE *ifile;
  24.     FILE *ofile;
  25.     char ifname[13],ofname[13];
  26.     bool flo;
  27.     mirsys(100,MAXBASE);
  28.     e=mirvar(0);
  29.     e1=mirvar(0);
  30.     e2=mirvar(0);
  31.     m=mirvar(0);
  32.     kd=mirvar(0);
  33.     ke=mirvar(0);
  34.     mn=mirvar(0);
  35.     mx=mirvar(0);
  36.     p=mirvar(0);
  37.     q=mirvar(0);
  38.     c=mirvar(0);
  39.     ifile=fopen("private.key","r");
  40.     IOBASE=60;
  41.     cinnum(kd,ifile);
  42.     cinnum(p,ifile);
  43.     cinnum(q,ifile);
  44.     fclose(ifile);
  45.     multiply(p,q,ke);
  46.     root(ke,3,mn);
  47.     multiply(mn,mn,m);
  48.     multiply(mn,m,mx);
  49.     subtract(mx,m,mx);
  50.     xgcd(p,q,c,c,c);  /* c.p = 1 mod q */
  51.     do
  52.     { /* get input file */
  53.         printf("file to be decoded = ");
  54.         gets(ifname);
  55.     } while (strlen(ifname)==0);
  56.     strip(ifname);
  57.     strcat(ifname,".rsa");
  58.     printf("output filename = ");
  59.     gets(ofname);
  60.     flo=FALSE;
  61.     if (strlen(ofname)>0) 
  62.     { /* set up output file */
  63.         flo=TRUE;
  64.         ofile=fopen(ofname,"w");
  65.     }
  66.     printf("decoding message\n");
  67.     ifile=fopen(ifname,"r");
  68.     forever
  69.     { /* decode line by line */
  70.         IOBASE=60;
  71.         cinnum(m,ifile);
  72.         if (size(m)==0) break;
  73.         powmod(m,kd,p,e1);        /* find result modulo p ...  */
  74.         powmod(m,kd,q,e2);        /* ..and q seperately as its */
  75.         subtract(e2,e1,e2);       /* 4 times quicker, and then */
  76.         multiply(e2,c,e2);        /* combine e1 and e2 using   */
  77.         divide(e2,q,q);           /* chinese remainder theorem */
  78.         if (size(e2)<0) add(e2,q,e2);
  79.         multiply(e2,p,e);
  80.         add(e,e1,e);
  81.         if (compare(e,mx)>=0) divide(e,mn,mn);
  82.         IOBASE=128;
  83.         if (flo) cotnum(e,ofile);
  84.         cotnum(e,stdout);
  85.     }
  86.     fclose(ifile);
  87.     if (flo) fclose(ofile);
  88.     printf("message ends\n");
  89. }
  90.