00001
00002 #include <sys/stat.h>
00003
00004
00005 #include "MyLib.h"
00006
00019 const int rsa_p = 61;
00020 const int rsa_q = 53;
00022 const char rsa_naFin[] = "_MyLib.c";
00023 const char rsa_naFcrp[] = "_MyLib.crp";
00024 const char rsa_naFres[] = "_MyLib.res";
00034 int testPodziel( int n)
00035 {
00036 int i,m;
00037
00038 m = n/2;
00039 for(i=2; i<m && n%i ; i=i+1)
00040 ;
00041 return (int)(i<m);
00042 }
00043
00048 int genKluczeRSA(int *e, int *d, int p, int q)
00049 {
00050 int n,fi_n,y;
00051
00052 if(testPodziel(p) || testPodziel(q))
00053 {
00054 puts("Upss ...");
00055 exit(-1);
00056 }
00057 n = p*q;
00058 fi_n = (p-1)*(q-1);
00064 *e = 17;
00065 if( NWD(*e,fi_n)!=1 )
00066 {
00067 puts("Upss ...");
00068 exit(-1);
00069 }
00074 NWDr(*e,fi_n,d,&y);
00075 while( *d<0 )
00076 {
00077 *d = (*d+fi_n) % fi_n;
00078 }
00079 return n;
00080 }
00081
00087 int sizeF(const char *naF)
00088 {
00089 struct stat sb;
00090
00091 if( stat(naF, &sb)==-1 )
00092 {
00093 perror(naF);
00094 exit(-1);
00095 }
00096 return (int)sb.st_size;
00097 }
00098
00104 void kryptFile(const char *naFout, const char *naFin, int e, int n)
00105 {
00106 FILE *Fout,*Fin;
00107 int i,N,M0,P;
00108 #if RSA_HEX
00109 char str[10],c;
00110 #else
00111 char c;
00112 #endif
00113
00114 N = sizeF(naFin);
00115 Fin = fopen(naFin, "r");
00116 if( Fin==NULL )
00117 {
00118 perror(naFin);
00119 exit(-1);
00120 }
00121 Fout = fopen(naFout, "w");
00122 for(i=0; i<N; i=i+1)
00123 {
00124 fread(&c,1,1,Fin);
00125 M0 = (int)c;
00126 P = pmod(M0,e,n);
00127 #if RSA_HEX
00128 sprintf(str,"%08x",P);
00129 fwrite(str,8,1,Fout);
00130 #else
00131 fwrite(&P,sizeof(int),1,Fout);
00132 #endif
00133 }
00134 fclose(Fout);
00135 fclose(Fin);
00136 }
00137
00143 void deKryptFile(const char *naFout, const char *naFin, int d, int n)
00144 {
00145 FILE *Fout,*Fin;
00146 int i,N,M1,P;
00147 char str[10];
00148
00149 #if RSA_HEX
00150 N = sizeF(naFin)/8;
00151 #else
00152 N = sizeF(naFin)/sizeof(int);
00153 #endif
00154 Fin = fopen(naFin, "r");
00155 if( Fin==NULL )
00156 {
00157 perror(naFin);
00158 exit(-1);
00159 }
00160 Fout = fopen(naFout, "w");
00161 for(i=0; i<N; i=i+1)
00162 {
00163 #if RSA_HEX
00164 fread(str,8,1,Fin);
00165 str[8] = '\0';
00166 P = strtol(str,NULL,16);
00167 #else
00168 fread(&P,sizeof(int),1,Fin);
00169 #endif
00170 M1 = pmod(P,d,n);
00171 sprintf(str,"%c", (char)M1);
00172 fwrite(str,1,1,Fout);
00173 }
00174 fclose(Fout);
00175 fclose(Fin);
00176 }
00177
00181 int sprRSA(const char *naF1, const char *naF2)
00182 {
00183 FILE *F1,*F2;
00184 unsigned char c1,c2;
00185 int i,n;
00186
00187 n = sizeF(naF1);
00188 if( n!=sizeF(naF2) )
00189 {
00190 return -1;
00191 }
00192 F1 = fopen(naF1,"r");
00193 F2 = fopen(naF2,"r");
00194 for(i=0; i<n; i=i+1)
00195 {
00196 fread(&c1,1,1,F1);
00197 fread(&c2,1,1,F2);
00198 if( c1!=c2)
00199 break;
00200 }
00201 fclose(F2);
00202 fclose(F1);
00203 return (i!=n ? -2 : 0 );
00204 }
00205
00206 int main()
00207 {
00208 int n,e,d,M0,M1,P;
00209
00210 n = genKluczeRSA(&e, &d, rsa_p, rsa_q);
00211 printf("Klucz publiczny: (%i, %i)\n", e,n);
00212 printf("Klucz prywatny : (%i, %i)\n\n", d,n);
00213
00214 M0 = 123;
00215 P = pmod(M0,e,n);
00216 printf("liczbe: %i zakodowano jako: %i\n", M0, P);
00217
00218 M1 = pmod(P,d,n);
00219
00220 printf("sprawdzenie kodowania liczby: ");
00221 if( M0!=M1 )
00222 {
00223 puts("Upss ...\n");
00224 exit(-1);
00225 }
00226 else
00227 {
00228 puts("OK !\n");
00229 }
00230 puts("Szyfrowanie plikow\n");
00231 printf("Plik do zaszyfrowania: \t%s\n",rsa_naFin);
00232 printf("Plik zaszyfrowany:\t%s\n",rsa_naFcrp);
00233 printf("Plik odszyfrowany:\t%s\n\n",rsa_naFres);
00234 #if RSA_HEX
00235 puts("Plik zaszyfrowany bedzie w hexach");
00236 #else
00237 puts("Plik zaszyfrowany bedzie w postaci binarnej");
00238 #endif
00239 kryptFile( rsa_naFcrp, rsa_naFin, e, n);
00240 deKryptFile( rsa_naFres, rsa_naFcrp, d, n);
00241 if( sprRSA(rsa_naFin, rsa_naFres) < 0 )
00242 {
00243 puts("Szyfrowanie i deszyfrowanie plikow NIE jest prawidlowe");
00244 }
00245 else
00246 {
00247 puts("Szyfrowanie i deszyfrowanie plikow JEST poprawne");
00248 }
00249 return 0;
00250 }