Dokumentacja pliku rsa.c

#include <sys/stat.h>
#include "MyLib.h"

Idź do kodu źródłowego tego pliku.

Funkcje

int testPodziel (int n)
int genKluczeRSA (int *e, int *d, int p, int q)
int sizeF (const char *naF)
void kryptFile (const char *naFout, const char *naFin, int e, int n)
void deKryptFile (const char *naFout, const char *naFin, int d, int n)
int sprRSA (const char *naF1, const char *naF2)
int main ()

Zmienne

const int rsa_p = 61
const int rsa_q = 53
const char rsa_naFin [] = "_MyLib.c"
const char rsa_naFcrp [] = "_MyLib.crp"
const char rsa_naFres [] = "_MyLib.res"


Dokumentacja funkcji

void deKryptFile ( const char *  naFout,
const char *  naFin,
int  d,
int  n 
)

deszyfracja pliku zaszyfrowanego metoda RSA

$d, n$ klucz prywatny

Definicja w linii 143 pliku rsa.c.

Odwołuje się do pmod() i sizeF().

Odwołania w main().

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 }

int genKluczeRSA ( int *  e,
int *  d,
int  p,
int  q 
)

generowanie klucza publicznego i prywatnego na rzecz metody szyfrowania RSA

Nota:
liczba $e$ jest wybrana w ten sposob, aby byla wzglednie pierwsza z $\varphi(n) $ tu $\varphi(n)=(p-1)(q-1)$

obliczam $d$ spelniajace $ed = 1 \mathop{\mathrm{mod}} \varphi(n)$

Definicja w linii 48 pliku rsa.c.

Odwołuje się do NWD(), NWDr() i testPodziel().

Odwołania w main().

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 }

void kryptFile ( const char *  naFout,
const char *  naFin,
int  e,
int  n 
)

szyfrowanie metoda RSA pliku

$e, n$ klucz publiczny

Definicja w linii 104 pliku rsa.c.

Odwołuje się do pmod() i sizeF().

Odwołania w main().

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 }

int main (  ) 

Definicja w linii 206 pliku rsa.c.

Odwołuje się do deKryptFile(), genKluczeRSA(), kryptFile(), pmod(), rsa_naFcrp, rsa_naFin, rsa_naFres, rsa_p, rsa_q i sprRSA().

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 // kodowanie liczby M
00214    M0 = 123;
00215    P  = pmod(M0,e,n);
00216    printf("liczbe: %i zakodowano jako: %i\n", M0, P);
00217 // dekodowanie P
00218    M1 = pmod(P,d,n);
00219 // sprawdzenie
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 }

int sizeF ( const char *  naF  ) 

wyznaczenie wielkosci pliku w bajtach

Parametry:
naF nazwa pliku

Definicja w linii 87 pliku rsa.c.

Odwołania w deKryptFile(), kryptFile() i sprRSA().

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 }

int sprRSA ( const char *  naF1,
const char *  naF2 
)

sprawdzenie identycznosci plikow

Definicja w linii 181 pliku rsa.c.

Odwołuje się do sizeF().

Odwołania w main().

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 }

int testPodziel ( int  n  ) 

sprawdzam, czy liczba $n$ jest pierwsza

bardziej zaawansowane metody testowania: Test AKS   (The AKS primality test)

Definicja w linii 34 pliku rsa.c.

Odwołania w genKluczeRSA().

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 }


Dokumentacja zmiennych

const char rsa_naFcrp[] = "_MyLib.crp"

zaszyfrowany plik

Definicja w linii 23 pliku rsa.c.

Odwołania w main().

const char rsa_naFin[] = "_MyLib.c"

plika do zaszyfrowania

Definicja w linii 22 pliku rsa.c.

Odwołania w main().

const char rsa_naFres[] = "_MyLib.res"

plik odszyfrowany

Definicja w linii 24 pliku rsa.c.

Odwołania w main().

const int rsa_p = 61

liczba pierwsza potrzebna w algorytmie RSA

Definicja w linii 19 pliku rsa.c.

Odwołania w main().

const int rsa_q = 53

liczba pierwsza potrzebna w algorytmie RSA

Definicja w linii 20 pliku rsa.c.

Odwołania w main().


Wygenerowano Wed Dec 16 02:25:48 2009 dla WIP w IM UWr. programem  doxygen 1.5.8