Dokumentacja pliku MyLib.c

#include "MyLib.h"

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

Funkcje

void WyswietlMacierz (int n, int m, double a[][matrix_M])
void ZapisMacierzy (char *NazwaPliku, int n, int m, double a[][matrix_M])
void OdczytMacierzy (const char *NazwaPliku, int *n, int *m, double a[][matrix_M])
int parserCSV (char *buf, char *ws[], int n, const char *delim)
int NWD (int p, int q)
int NWDr (int p, int q, int *x, int *y)
int pmod (int b, int e, int m)
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)
void WyswietlMacierzInd (int n, int m, double A[][matrix_M], int P[])
void WyswietlWiersz (int m, double w[])
double ObliczWyznacznik (int *row, int P[], int n, int m, double A[][matrix_M])

Zmienne

const int matrix_N = 25
const int matrix_M = 25
const char separator [] = ";\r\t\n"
const char sepStr [] = "\""
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"
const char det_naF [] = "A.dat"

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 327 pliku MyLib.c.

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

00328 {
00329    FILE *Fout,*Fin;
00330    int i,N,M1,P;
00331    char str[10];
00332 
00333 #if RSA_HEX
00334    N = sizeF(naFin)/8;
00335 #else
00336    N = sizeF(naFin)/sizeof(int);
00337 #endif
00338    Fin = fopen(naFin, "r");
00339    if( Fin==NULL )
00340    {
00341       perror(naFin);
00342       exit(-1);
00343    }
00344    Fout = fopen(naFout, "w");
00345    for(i=0; i<N; i=i+1)
00346    {
00347 #if RSA_HEX
00348       fread(str,8,1,Fin);
00349       str[8] = '\0';
00350       P  = strtol(str,NULL,16);
00351 #else
00352       fread(&P,sizeof(int),1,Fin);
00353 #endif
00354       M1 = pmod(P,d,n);
00355       sprintf(str,"%c", (char)M1);
00356       fwrite(str,1,1,Fout);
00357    }
00358    fclose(Fout);
00359    fclose(Fin);
00360 }

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 232 pliku MyLib.c.

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

00233 {
00234     int n,fi_n,y;
00235 
00236     if(testPodziel(p) || testPodziel(q))
00237     {
00238        puts("Upss ...");
00239        exit(-1);
00240     }
00241     n = p*q;
00242     fi_n = (p-1)*(q-1);
00248     *e = 17;
00249     if( NWD(*e,fi_n)!=1 )
00250     {
00251        puts("Upss ...");
00252        exit(-1);
00253     }
00258     NWDr(*e,fi_n,d,&y);
00259     while( *d<0 )
00260     {
00261        *d = (*d+fi_n) % fi_n;
00262     }
00263     return n;
00264 }

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

szyfrowanie metoda RSA pliku

$e, n$ klucz publiczny

Definicja w linii 288 pliku MyLib.c.

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

00289 {
00290    FILE *Fout,*Fin;
00291    int i,N,M0,P;
00292 #if RSA_HEX
00293    char str[10],c;
00294 #else
00295    char c;
00296 #endif
00297 
00298    N = sizeF(naFin);
00299    Fin = fopen(naFin, "r");
00300    if( Fin==NULL )
00301    {
00302       perror(naFin);
00303       exit(-1);
00304    }
00305    Fout = fopen(naFout, "w");
00306    for(i=0; i<N; i=i+1)
00307    {
00308       fread(&c,1,1,Fin);
00309       M0 = (int)c;
00310       P  = pmod(M0,e,n);
00311 #if RSA_HEX
00312       sprintf(str,"%08x",P);
00313       fwrite(str,8,1,Fout);
00314 #else
00315       fwrite(&P,sizeof(int),1,Fout);
00316 #endif
00317    }
00318    fclose(Fout);
00319    fclose(Fin);
00320 }

int NWD ( int  p,
int  q 
)

Najwiekszy Wspolny Dzielnik

Popularny algorytm Euklidesa

Definicja w linii 151 pliku MyLib.c.

Odwołania w genKluczeRSA().

00152 {
00153    int r;
00154 
00155    if( p<1 || q<1 )
00156    {
00157       puts("Ups ...");
00158       exit(-1);
00159    }
00160    for(r=p%q; r!=0; r=p%q)
00161    {
00162       p = q;
00163       q = r;
00164    }
00165    return q;
00166 }

int NWDr ( int  p,
int  q,
int *  x,
int *  y 
)

rozszerzony algorytm Euklidesa: $p*x+q*y=\mathop{\mathrm{NWD}}(p,q)$

Definicja w linii 171 pliku MyLib.c.

Odwołania w genKluczeRSA().

00172 {
00173    int r,t,xp,xr,yp,yr;
00174 
00175    if( p<1 || q<1 )
00176    {
00177       puts("Ups ...");
00178       exit(-1);
00179    }
00180    xp = *y = 1;
00181    *x = yp = 0;
00182    for(r=p%q; r!=0; r=p%q)
00183    {
00184       t  = p/q;
00185       p  = q;
00186       q  = r;
00187       xr = *x;
00188       *x = xp - t*xr;
00189       xp = xr;
00190       yr = *y;
00191       *y = yp - t*yr;
00192       yp = yr;
00193    }
00194    return q;
00195 }

double ObliczWyznacznik ( int *  row,
int  P[],
int  n,
int  m,
double  A[][matrix_M] 
)

obliczenie wyznacznika metoda eleminacji Gaussa (Gaussian elimination),

Parametry:
P opisuje zamiane wierszy,
row okresla wiersz do ktorego metoda "doszla".

Definicja w linii 428 pliku MyLib.c.

Odwołuje się do matrix_N.

00429 {
00430    double d[matrix_M],det;
00431    int i,j;
00432 
00433    for(i=0; i<matrix_N; i=i+1)
00434    {
00435       P[i] = i;
00436    }
00437    det = 1.0;
00438    for(*row=0; *row<n; *row=*row+1)
00439    {
00440       if( fabs(A[P[*row]][*row])<=1.0e-100 )
00441       {
00442          for(i=*row+1; i<n; i=i+1 )
00443          {
00444             if( 1.0e-100<fabs( A[P[i]][*row] ) )
00445             {
00446                j       = P[*row];
00447                P[*row] = P[i];
00448                P[i]    = j;
00449                det     = -det;
00450                break;
00451             }
00452          }
00453          if( i==n )
00454          {
00455             for(i=0; i<*row-1; i=i+1)
00456             {
00457                det = A[P[i]][i]*det;
00458             }
00459             return det;
00460          }
00461       }
00462       for(i=*row+1; i<m; i=i+1)
00463       {
00464          d[i] = A[P[*row]][i]/A[P[*row]][*row];
00465       }
00466       for(j=*row+1; j<n; j=j+1)
00467       {
00468          for(i=*row+1; i<m; i=i+1)
00469          {
00470             A[P[j]][i] = A[P[j]][i]-d[i]*A[P[j]][*row];
00471          }
00472          A[P[j]][*row] = 0.0;
00473       }
00474    }
00475    for(i=0; i<n; i=i+1)
00476    {
00477       det = A[P[i]][i]*det;
00478    }
00479    return det;
00480 }

void OdczytMacierzy ( const char *  NazwaPliku,
int *  n,
int *  m,
double  a[][matrix_M] 
)

Definicja w linii 39 pliku MyLib.c.

00040 {
00041     FILE *fPlik;
00042     int i,j;
00043 
00044     fPlik = fopen(NazwaPliku,"r");
00045     fscanf(fPlik,"%i", n);
00046     fscanf(fPlik,"%i", m);
00047     for(i=0; i<*n; i=i+1)
00048     {
00049         for(j=0; j<*m; j=j+1)
00050         {
00051             fscanf(fPlik,"%lf",&a[i][j]);
00052         }
00053     }
00054     fclose(fPlik);
00055 }

int parserCSV ( char *  buf,
char *  ws[],
int  n,
const char *  delim 
)

Obsluguje formaty Excel-CSV oraz TSV (ISO-8859-2)

Definicja w linii 67 pliku MyLib.c.

Odwołania w readCSV().

00068 {
00069     int i;
00070 
00071     ws[0] = buf;
00072     for(i=1; i<=n; i=i+1)
00073     {
00074         ws[i] = strpbrk(ws[i-1], delim);
00075         if( ws[i]==NULL)
00076             break;
00077         *ws[i] = '\0';
00078         ws[i]  = ws[i]+1;
00079     }
00080     return i-1;
00081 }

int pmod ( int  b,
int  e,
int  m 
)

naiwna potega $b^e \mathop{\mathrm{mod}} m$

Definicja w linii 200 pliku MyLib.c.

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

00201 {
00202    int c;
00203 
00204    for(c=1; 1<=e; e=e-1)
00205    {
00206       c = (c*b)%m;
00207    }
00208    return c;
00209 }

int sizeF ( const char *  naF  ) 

wyznaczenie wielkosci pliku w bajtach

Parametry:
naF nazwa pliku

Definicja w linii 271 pliku MyLib.c.

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

00272 {
00273    struct stat sb;
00274 
00275    if( stat(naF, &sb)==-1 )
00276    {
00277       perror(naF);
00278       exit(-1);
00279    }
00280    return (int)sb.st_size;
00281 }

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

sprawdzenie identycznosci plikow

Definicja w linii 365 pliku MyLib.c.

Odwołuje się do sizeF().

00366 {
00367    FILE *F1,*F2;
00368    unsigned char c1,c2;
00369    int i,n;
00370 
00371    n = sizeF(naF1);
00372    if( n!=sizeF(naF2) )
00373    {
00374       return -1;
00375    }
00376    F1 = fopen(naF1,"r");
00377    F2 = fopen(naF2,"r");
00378    for(i=0; i<n; i=i+1)
00379    {
00380       fread(&c1,1,1,F1);
00381       fread(&c2,1,1,F2);
00382       if( c1!=c2)
00383          break;
00384    }
00385    fclose(F2);
00386    fclose(F1);
00387    return (i!=n ? -2 : 0 );
00388 }

int testPodziel ( int  n  ) 

sprawdzam, czy liczba $n$ jest pierwsza

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

Definicja w linii 218 pliku MyLib.c.

Odwołania w genKluczeRSA().

00219 {
00220    int i,m;
00221 
00222    m = n/2;
00223    for(i=2; i<m && n%i ; i=i+1)
00224       ;
00225    return (int)(i<m);
00226 }

void WyswietlMacierz ( int  n,
int  m,
double  a[][matrix_M] 
)

Definicja w linii 8 pliku MyLib.c.

00009 {
00010     int i,j;
00011 
00012     for(i=0; i<n; i=i+1)
00013     {
00014         for(j=0; j<m; j=j+1)
00015         {
00016             printf("%6.2lf ",a[i][j]);
00017         }
00018         printf("\n");
00019     }
00020 }

void WyswietlMacierzInd ( int  n,
int  m,
double  A[][matrix_M],
int  P[] 
)

wyswietlenie macierzy z uwzglednieniem permutacji wierszy

Parametry:
P permutacja wierszy

Definicja w linii 398 pliku MyLib.c.

00399 {
00400     int i,j;
00401 
00402     for(i=0; i<n; i=i+1)
00403     {
00404         for(j=0; j<m; j=j+1)
00405         {
00406             printf("%6.2lf ",A[P[i]][j]);
00407         }
00408         printf("\n");
00409     }
00410 }

void WyswietlWiersz ( int  m,
double  w[] 
)

Definicja w linii 412 pliku MyLib.c.

00413 {
00414     int j;
00415 
00416     for(j=0; j<m; j=j+1)
00417     {
00418         printf("%6.2lf ",w[j]);
00419     }
00420     printf("\n");
00421 }

void ZapisMacierzy ( char *  NazwaPliku,
int  n,
int  m,
double  a[][matrix_M] 
)

Definicja w linii 22 pliku MyLib.c.

00023 {
00024     FILE *fPlik;
00025     int i,j;
00026 
00027     fPlik = fopen(NazwaPliku,"w");
00028     fprintf(fPlik,"%i\n%i\n",n,m);
00029     for(i=0; i<n; i=i+1)
00030     {
00031         for(j=0; j<m; j=j+1)
00032         {
00033             fprintf(fPlik,"%4.2lf\n",a[i][j]);
00034         }
00035     }
00036     fclose(fPlik);
00037 }


Dokumentacja zmiennych

const char det_naF[] = "A.dat"

nazwa pliku z macierza

Definicja w linii 392 pliku MyLib.c.

const int matrix_M = 25

maksymalna ilosc kolumn w macierzy

Definicja w linii 6 pliku MyLib.c.

const int matrix_N = 25

maksymalna ilosc wierszy w macierzy

Definicja w linii 5 pliku MyLib.c.

Odwołania w ObliczWyznacznik().

const char rsa_naFcrp[] = "_MyLib.crp"

zaszyfrowany plik

Definicja w linii 143 pliku MyLib.c.

const char rsa_naFin[] = "_MyLib.c"

plika do zaszyfrowania

Definicja w linii 142 pliku MyLib.c.

const char rsa_naFres[] = "_MyLib.res"

plik odszyfrowany

Definicja w linii 144 pliku MyLib.c.

const int rsa_p = 61

liczba pierwsza potrzebna w algorytmie RSA

Definicja w linii 139 pliku MyLib.c.

const int rsa_q = 53

liczba pierwsza potrzebna w algorytmie RSA

Definicja w linii 140 pliku MyLib.c.

const char separator[] = ";\r\t\n"

Definicja w linii 59 pliku MyLib.c.

Odwołania w readCSV().

const char sepStr[] = "\""

Definicja w linii 60 pliku MyLib.c.

Odwołania w readCSV().


Wygenerowano Mon Jan 11 11:51:40 2010 dla WIP w IM UWr. programem  doxygen 1.6.1