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

  1. /*
  2.  *   Program to decipher message using OKAMOTO 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. {  /*  decipher using private key  */
  22.     big m,m1,m2,pq,p,q,n,x,y,z,w,u1,u2,a1,a2,b1,b2,ab,c;
  23.     FILE *ifile;
  24.     FILE *ofile;
  25.     int turn;
  26.     char ifname[13],ofname[13];
  27.     bool flo;
  28.     mirsys(100,MAXBASE);
  29.     m=mirvar(0);
  30.     m1=mirvar(0);
  31.     m2=mirvar(0);
  32.     pq=mirvar(0);
  33.     p=mirvar(0);
  34.     q=mirvar(0);
  35.     n=mirvar(0);
  36.     x=mirvar(0);
  37.     y=mirvar(0);
  38.     w=mirvar(0);
  39.     z=mirvar(0);
  40.     u1=mirvar(0);
  41.     u2=mirvar(0);
  42.     a1=mirvar(0);
  43.     a2=mirvar(0);
  44.     b1=mirvar(0);
  45.     b2=mirvar(0);
  46.     ab=mirvar(0);
  47.     c=mirvar(0);
  48.     IOBASE=60;
  49.     ifile=fopen("private.key","r");
  50.     cinnum(p,ifile);
  51.     cinnum(q,ifile);
  52.     cinnum(u1,ifile);
  53.     cinnum(u2,ifile);
  54.     fclose(ifile);
  55.     multiply(p,q,pq);
  56.     multiply(pq,p,n);
  57.     copy(u1,a1);
  58.     divide(a1,pq,b1);      /* get a1, b1 */
  59.     copy(u2,a2);
  60.     divide(a2,pq,b2);      /* get a2, b2 */
  61.     multiply(a1,b2,ab);
  62.     multiply(a2,b1,c);
  63.     subtract(ab,c,ab);
  64.     copy(u1,u2);
  65.     mad(u1,u1,u1,pq,pq,u1); /* u1 = u1.u1 mod pq */
  66.     mad(u2,u2,u2,n,n,u2);   /* u2 = u1.u1 mod n  */
  67.     xgcd(ab,p,ab,ab,ab);    /* ab = 1/ab mod p   */
  68.     do
  69.     { /* get input file */
  70.         printf("file to be deciphered = ");
  71.         gets(ifname);
  72.     } while (strlen(ifname)==0);
  73.     strip(ifname);
  74.     strcat(ifname,".oka");
  75.     printf("output filename = ");
  76.     gets(ofname);
  77.     flo=FALSE;
  78.     if (strlen(ofname)>0) 
  79.     { /* set up output file */
  80.         flo=TRUE;
  81.         ofile=fopen(ofname,"w");
  82.     }
  83.     printf("deciphering message\n");
  84.     ifile=fopen(ifname,"r");          
  85.     turn=0;
  86.     forever
  87.     { /* decipher line by line */
  88.         IOBASE=60;                    
  89.         cinnum(c,ifile);
  90.         if (size(c)==0) break;
  91.         IOBASE=128;
  92.         if (turn==0)
  93.         {
  94.             mad(c,u1,u1,pq,pq,x);     /* x = c.u1 mod pq     */
  95.             mad(c,u2,u2,n,n,y);
  96.             divide(y,pq,y);           /* y = (c.u2 mod n)/pq */
  97.             root(x,2,z);              /* z = x^(1/2)         */
  98.             premult(z,2,x);
  99.             xgcd(x,p,x,x,x);          /* x = 1/(2z) mod p    */
  100.             mad(y,x,x,p,p,w);         /* w = y.x mod p       */
  101.             multiply(a1,w,m1);
  102.             multiply(b1,z,c);
  103.             subtract(m1,c,m1);
  104.             mad(m1,ab,ab,p,p,m1);     /* m1 = (a1.w - b1.z).ab mod p */
  105.             if (size(m1)<0) add(m1,p,m1);
  106.             if (flo) cotnum(m1,ofile);
  107.             cotnum(m1,stdout);
  108.             multiply(b2,z,m2);
  109.             multiply(a2,w,c);
  110.             subtract(m2,c,m2);
  111.             mad(m2,ab,ab,p,p,m2);     /* m2 = (b2.z - a2.w).ab mod p */
  112.             if (size(m2)<0) add(m2,p,m2);
  113.             if (flo) cotnum(m2,ofile);
  114.             cotnum(m2,stdout);
  115.         }
  116.         else
  117.         {
  118.             if (turn==1) xgcd(m2,n,m,m,m);
  119.             if (turn==2) xgcd(m1,n,m,m,m);
  120.             mad(c,m,m,n,n,m);              /* m = c/m mod n */
  121.             if (size(m)<0) add(m,n,m);
  122.             if (flo) cotnum(m,ofile);
  123.             cotnum(m,stdout);
  124.         }
  125.         turn++;
  126.         if (turn>2) turn=0;
  127.     }
  128.     fclose(ifile);
  129.     if (flo) fclose(ofile);
  130.     printf("message ends\n");
  131. }
  132.  
  133.