Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<math.h>
- //FUNKCJA ZMIENIA CHAR NA BIT
- unsigned char_to_bit(const char *ciag){
- int a=0,wynik=0;
- for(a=0;a<strlen(ciag);a++)wynik+=pow((float)2,(int)strlen(ciag)-1-a)*(ciag[a]-'0');
- return wynik;
- }
- char *bit_to_char(unsigned bit){
- int a=0,b;
- char *liczba;
- while(pow((float)2,a)<bit){
- a++;
- if(pow((float)2,a)>bit){
- a--;
- break;
- }
- }
- liczba=(char*)malloc(sizeof(*liczba)*(a+2));
- for(b=0;b<=a;b++){
- if(bit>=pow((float)2,(a-b))){
- liczba[b]='1';
- bit-=pow((float)2,(a-b));
- }
- else liczba[b]='0';
- }
- liczba[a+1]='\0';
- return liczba;
- }
- ////FUNKCJA DZIELENIE 2 CIAGOW BITOWYCH
- ////DZIALA
- ////ZWRACA WYNIK DZIELENIA
- //char *dziel(char *ciag1,char* ciag2){
- // int a,b,c;
- // int test=0;
- // char *ciag1_kopia=(char*)malloc(sizeof(*ciag1_kopia)*7);
- // char *schowek=(char*)malloc(sizeof(*schowek)*4);
- //
- // strcpy(ciag1_kopia,ciag1);
- // //schowek zwracany przypisanie w przypadku mniejszego ciagu
- // //przechowuje 4 ostatnie bity ciag1_kopia
- // for(a=0;a<4;a++){
- // schowek[a]=ciag1_kopia[a+3];
- // }
- // //petla liczaca przesuniecie 2 maks
- // for(a=0;a<3;a++){
- // /*test=0;
- // for(b=0;b<a;b++){
- // if(ciag1_kopia[b]=='1'){
- // test=1;
- // break;
- // }
- // }
- // if(test==0){
- // for(b=0;b<5;b++){
- // if(ciag1_kopia[b+a]-ciag2[b]==1){test=1;break;}
- // if(ciag1_kopia[b+a]-ciag2[b]==-1)break;
- // }
- // }
- // if(test){
- // for(c=0;c<a;c++)if(ciag1_kopia[c]=='1'){ciag1_kopia[c]='0';ciag1_kopia[c+1]+=1;}
- // for(b=0;b<5;b++){
- // ciag1_kopia[b+a]-=ciag2[b];
- // if(ciag1_kopia[b+a]==-1)ciag1_kopia[b+a]=49;
- // else ciag1_kopia[b+a]+='0';
- //
- // }
- // }*/
- // if(ciag1_kopia[a]!='0'){
- // for(b=0;b<5;b++){
- // ciag1_kopia[b+a]-=ciag2[b];
- // if(ciag1_kopia[b+a]==-1)ciag1_kopia[b+a]=49;
- // else ciag1_kopia[b+a]+='0';
- // }
- // }
- // for(b=0;b<4;b++)schowek[b]=ciag1_kopia[b+3];
- // }
- // //free(ciag1_kopia);
- // return schowek;
- //}
- //
- ////FUNKCJA MNOZENIE 2 CIAGOW BITOWYCH
- ////DZIALA
- ////ZWRACA WYNIK MNOZENIA 2 CIAGOW
- //unsigned mnoz(const unsigned ciag, const unsigned ciag3){
- // char suma[4][7];
- // char *ciag1=(char*)malloc(sizeof(*ciag1)*4);
- // char *ciag2=(char*)malloc(sizeof(*ciag2)*4);
- // int a, b;
- // char *wynik=(char*)malloc(sizeof(*wynik)*7);
- // bit_to_char(ciag,&ciag1);
- // bit_to_char(ciag3,&ciag2);
- //
- //
- //
- // for (a = 0; a < 4; a++){
- // for (b = 0; b < 7; b++){
- // if (a > b)suma[a][b] = '0';
- // else if(b-a>=0 && b-a<4) suma[a][b] = ((ciag1[b-a] - '0') * (ciag2[b - a] - '0')) + '0';
- // else suma[a][b] = '0';
- // }
- // }
- //
- // for (a = 0; a < 7; a++){
- // wynik[a] = 0;
- // for (b = 0; b < 4; b++){
- // wynik[a] += suma[b][a]-'0';
- // }
- // wynik[a] = (wynik[a] % 2)+'0';
- // }
- // free(ciag1);
- // free(ciag2);
- // return char_to_bit(dziel(wynik,"10011"));
- //}
- //FUNKCJA MNOZENIE DWOCH MACIERZY
- void mnoz_mac(const unsigned macierz[2][2],const unsigned macierz2[2][2],unsigned macierz_wynik[2][2]){
- //printf("%d\n%d\n%d\n%d",macierz[0][0],macierz2[0][0],macierz[0][1],macierz2[1][0]);
- macierz_wynik[0][0]=((macierz[0][0]*macierz2[0][0])%15)^((macierz[0][1]*macierz2[1][0])%15);
- macierz_wynik[1][0]=((macierz[1][0]*macierz2[0][0])%15)^((macierz[1][1],macierz2[1][0])%15);
- macierz_wynik[0][1]=((macierz[0][0]*macierz2[0][1])%15)^((macierz[0][1],macierz2[1][1])%15);
- macierz_wynik[1][1]=((macierz[1][0]*macierz2[0][1])%15)^((macierz[1][1],macierz2[1][1])%15);
- }
- //FUNKCJA DODAWANIE 2 MACIERZY
- void dod_mac(const unsigned macierz[2][2],const unsigned macierz2[2][2], unsigned macierz_wynik[2][2]){
- int a,b;
- for(a=0;a<2;a++){
- for(b=0;b<2;b++){
- macierz_wynik[a][b]=macierz[a][b]^macierz2[a][b];
- }
- }
- }
- //FUNKCJA ZK
- void zk(unsigned macierz[2][2]){
- unsigned schowek;
- schowek=macierz[1][1];
- macierz[1][1]=macierz[1][0];
- macierz[1][0]=schowek;
- }
- //FUNKCJA MM
- void mm(unsigned macierz[2][2]){
- unsigned macierz_m[2][2];
- unsigned macierz2[2][2];
- int a,b;
- for(a=0;a<2;a++){
- for(b=0;b<2;b++){
- macierz2[a][b]=macierz[a][b];
- }
- }
- macierz_m[0][0]=char_to_bit("0011");
- macierz_m[1][0]=char_to_bit("0010");
- macierz_m[0][1]=char_to_bit("0010");
- macierz_m[1][1]=char_to_bit("0011");
- mnoz_mac(macierz_m,macierz2,macierz);
- }
- //FUNKCJA SBOX
- //TYP=1-SZYFROWANIE
- //TYP=2-DESZYFROWANIE
- unsigned sbox(const int typ,const unsigned bit){
- //typ E
- if(typ==0){
- if(bit==0)return char_to_bit("1110");
- if(bit==1)return char_to_bit("0100");
- if(bit==2)return char_to_bit("1101");
- if(bit==3)return char_to_bit("0001");
- if(bit==4)return char_to_bit("0010");
- if(bit==5)return char_to_bit("1111");
- if(bit==6)return char_to_bit("1011");
- if(bit==7)return char_to_bit("1000");
- if(bit==8)return char_to_bit("0011");
- if(bit==9)return char_to_bit("1010");
- if(bit==10)return char_to_bit("0110");
- if(bit==11)return char_to_bit("1100");
- if(bit==12)return char_to_bit("0101");
- if(bit==13)return char_to_bit("1001");
- if(bit==14)return char_to_bit("0000");
- if(bit==15)return char_to_bit("0111");
- }
- else{
- if(bit==0)return char_to_bit("1110");
- if(bit==1)return char_to_bit("0011");
- if(bit==2)return char_to_bit("0100");
- if(bit==3)return char_to_bit("1000");
- if(bit==4)return char_to_bit("0001");
- if(bit==5)return char_to_bit("1100");
- if(bit==6)return char_to_bit("1010");
- if(bit==7)return char_to_bit("1111");
- if(bit==8)return char_to_bit("0111");
- if(bit==9)return char_to_bit("1101");
- if(bit==10)return char_to_bit("1001");
- if(bit==11)return char_to_bit("0110");
- if(bit==12)return char_to_bit("1011");
- if(bit==13)return char_to_bit("0010");
- if(bit==14)return char_to_bit("0000");
- if(bit==15)return char_to_bit("0101");
- }
- }
- //FUNKCJA FgBOX
- void fgbox(unsigned macierz[2][2],int typ){
- int a,b;
- for(a=0;a<2;a++){
- for(b=0;b<2;b++){
- macierz[a][b]=sbox(typ,macierz[a][b]);
- }
- }
- }
- //FUNKCJA TWORZENIE MACIERZY
- //DZIALA
- void tworzenie(unsigned macierz[2][2],char *ciag){
- char schowek[4][5];
- int a,b;
- for(a=0;a<4;a++){
- for(b=0;b<4;b++){
- schowek[a][b]=ciag[a*4+b];
- }
- schowek[a][4]='\0';
- }
- macierz[0][0]=char_to_bit(schowek[0]);
- macierz[0][1]=char_to_bit(schowek[1]);
- macierz[1][0]=char_to_bit(schowek[2]);
- macierz[1][1]=char_to_bit(schowek[3]);
- }
- int main(void){
- //DEKLARACJA ZMIENNYCH
- char *k0="1011001011110110";
- char *t="0011110011000011";
- //1 wymiar-k0,lub t
- //2 wymiar-wiersz
- //3 wymiar-kolumna
- //4 wymiar-ciag znakow
- unsigned test=2;
- unsigned test2=3;
- unsigned klucz[3][2][2];
- unsigned wiad[2][2];
- unsigned mac_a[2][2];
- int a,b,c;
- char *wynik=(char*)malloc(sizeof(*wynik)*7);
- //ALOKACJA PAMIECI I PODSTAWOWE PRZYPISYWANIE
- //TWORZENIE MACIERZY
- tworzenie(klucz[0],k0);
- tworzenie(wiad,t);
- //KLUCZ RUNDY 0
- //GENEROWANIE KLUCZA 1 RUNDY
- klucz[1][0][0]=(sbox(0,klucz[0][1][1])^1)^klucz[0][0][0];
- klucz[1][1][0]=klucz[0][1][0]^klucz[1][0][0];
- klucz[1][0][1]=klucz[0][0][1]^klucz[1][1][0];
- klucz[1][1][1]=klucz[0][1][1]^klucz[1][0][1];
- //GENEROWANIE KLUCZA 2 RUNDY
- klucz[2][0][0]=(sbox(0,klucz[1][1][1])^2)^klucz[1][0][0];
- klucz[2][1][0]=klucz[1][1][0]^klucz[2][0][0];
- klucz[2][0][1]=klucz[1][0][1]^klucz[2][1][0];
- klucz[2][1][1]=klucz[1][1][1]^klucz[2][0][1];
- //DODAWANIE KLUCZA 0 RUNDY DO WIADOMOSCI
- dod_mac(klucz[0],wiad,mac_a);
- //ZASTOSOWANIE FUNKCJI FSBOX
- fgbox(mac_a,0);
- //ZASTOSOWANIE FUNKCJI ZK
- zk(mac_a);
- //ZASTOSOWANIE FUNKCJI MM
- mm(mac_a);
- dod_mac(mac_a,klucz[1],mac_a);
- fgbox(mac_a,0);
- zk(mac_a);
- dod_mac(mac_a,klucz[2],mac_a);
- printf("=====DANE ZASZYFROWANE=====\n\n");
- for(a=0;a<2;a++){
- for(b=0;b<2;b++){
- if(mac_a[a][b]<=7)printf("0");
- fputs(bit_to_char(mac_a[a][b]),stdout);
- }
- }
- printf("\n\n");
- dod_mac(mac_a,klucz[2],mac_a);
- zk(mac_a);
- fgbox(mac_a,1);
- dod_mac(mac_a,klucz[1],mac_a);
- mm(mac_a);
- zk(mac_a);
- fgbox(mac_a,1);
- printf("test");
- dod_mac(mac_a,klucz[0],mac_a);
- printf("=====DANE ODSZYFROWANE=====\n\n");
- for(a=0;a<2;a++){
- for(b=0;b<2;b++){
- if(mac_a[a][b]<=7)printf("0");
- fputs(bit_to_char(mac_a[a][b]),stdout);
- }
- }
- printf("\n\n");
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement