티스토리 뷰

개념/정보보호

정보보호 AES

상어악어 2022. 10. 26. 23:10
반응형
#include <iostream>
#include <string>
using namespace std;

int Ascii_To_Int(int);  //아스키 코드의 문자를 정수로 변환하는 함수
string Char_To_Binary(char);    //문자 하나를 이진수로 변환하는 함수
string Binary_To_Char(string);    //4비트 하나를 문자로 변환하는 함수
string String_To_Binary(string);    //string(문자 2개)을 이진수로 변환하는 함수
string XOR(string, string); //xor연산을 하는 함수
string Binary_To_String(string); //이진수를 문자로 변환하는 함수


string S_Box[16][16]={      //SBOX
     {"63", "7C", "77", "7B", "F2", "6B", "6F", "C5", "30", "01", "67", "2B", "FE", "D7", "AB", "76"},
     {"CA", "82", "C9", "7D", "FA", "59", "47", "F0", "AD", "D4", "A2", "AF", "9C", "A4", "72", "C0"},
     {"B7", "FD", "93", "26", "36", "3F", "F7", "CC", "34", "A5", "E5", "F1", "71", "D8", "31", "15"},
     {"04", "C7", "23", "C3", "18", "96", "05", "9A", "07", "12", "80", "E2", "EB", "27", "B2", "75"},
     {"09", "83", "2C", "1A", "1B", "6E", "5A", "A0", "52", "3B", "D6", "B3", "29", "E3", "2F", "84"},
     {"53", "D1", "00", "ED", "20", "FC", "B1", "5B", "6A", "CB", "BE", "39", "4A", "4C", "58", "CF"},
     {"D0", "EF", "AA", "FB", "43", "4D", "33", "85", "45", "F9", "02", "7F", "50", "3C", "9F", "A8"},
     {"51", "A3", "40", "8F", "92", "9D", "38", "F5", "BC", "B6", "DA", "21", "10", "FF", "F3", "D2"},
     {"CD", "0C", "13", "EC", "5F", "97", "44", "17", "C4", "A7", "7E", "3D", "64", "5D", "19", "73"},
     {"60", "81", "4F", "DC", "22", "2A", "90", "88", "46", "EE", "B8", "14", "DE", "5E", "0B", "DB"},
     {"E0", "32", "3A", "0A", "49", "06", "24", "5C", "C2", "D3", "AC", "62", "91", "95", "E4", "79"},
     {"E7", "C8", "37", "6D", "8D", "D5", "4E", "A9", "6C", "56", "F4", "EA", "65", "7A", "AE", "08"},
     {"BA", "78", "25", "2E", "1C", "A6", "B4", "C6", "E8", "DD", "74", "1F", "4B", "BD", "8B", "8A"},
     {"70", "3E", "B5", "66", "48", "03", "F6", "0E", "61", "35", "57", "B9", "86", "C1", "1D", "9E"},
     {"E1", "F8", "98", "11", "69", "D9", "8E", "94", "9B", "1E", "87", "E9", "CE", "55", "28", "DF"},
     {"BC", "A1", "89", "0D", "BF", "E6", "42", "68", "41", "99", "2D", "0F", "B0", "54", "BB", "16"}
};


string Rcon[11]={   //Rcon
    "00","01","02","04","08","10","20","40","80","1B","38"
};

int main(){

    string W_fourthcol[4];   //4번째 컬럼값 가져오는 배열
    string W_fourthcol_rotate[4]; //회전을 적용한 배열
    string W_S_Box[4];   //SBOX값 적용한 배열
    string rcon_first;          //첫번째 rcon값
    string Z[4];     //Z값
    string Binary_W[4][4];    //각 라운드의 w값을 이진수로 저장한 배열
    string Result_Binary_W[4][4];    // 다음라운드 키값을 이진수로 저장한 배열 

    string W[4][4]={    //각 라운드의 w값이 저장될 배열
        {"0F", "47", "0C", "AF"},
        {"15", "D9", "B7", "7F"},
        {"71", "E8", "AD", "67"},
        {"C9", "59", "D6", "98"}
    };


    int round=1;        //라운드 값


    for(round; round<=11; round++){
        cout<<"round: "<<round<<endl;


        
        for(int i=0; i<4; i++){
            for(int j=0; j<4; j++){
                cout<<W[i][j]<<" ";
            }
            cout<<endl;
        }


        for(int i=0; i<4; i++){
            W_fourthcol[i]=W[i][3]; //W마지막 열 값 가져오기
            }       

        for(int i=1; i<4; i++){
            W_fourthcol_rotate[i-1]=W_fourthcol[i];     //회전을 적용시켜 W_fourthcol_rotate에 저장해 준다
        }

        W_fourthcol_rotate[3]=W_fourthcol[0];


        for(int i=0; i<4; i++){
            string temp=W_fourthcol_rotate[i];  //값 하나 가져오기
            int first=temp[0];  //첫번째 글자 하나 가져오기
             int second=temp[1]; //두번째 글자 하나 가져오기
              first=Ascii_To_Int(first);
              second=Ascii_To_Int(second);    //아스키 코드 변환해서 정수 값 얻어내기
              W_S_Box[i]=S_Box[first][second];    //얻어낸 index를 통해 S_BoX에서 찾아서 W_S_Box에 저장
            
         }


            rcon_first=Rcon[round]; //rcon 첫번째 값 저장하기
            rcon_first=String_To_Binary(rcon_first);    //이진수로 변환하기


        for(int i=0; i<4; i++){
            Z[i]=String_To_Binary(W_S_Box[i]);  // Z값 이진수로 얻어내기
            for(int j=0; j<4; j++){
                  Binary_W[j][i]=String_To_Binary(W[j][i]);
             }
         }
        
        

        string return1=XOR(Z[0],rcon_first); //rcon은 첫번째 값을 제외한 값이 0이므로 xor해도 값이그대로다
                                                //따라서 rcon_first와 Z[0]과 XOR한번만 해주면 Z값이 나온다

        Z[0]=return1;    //return1값을 Z[0]에 넣는다

        for(int i=0; i<4; i++){
            string result;
            for(int j=0; j<4; j++){
                if(i==0){   //i=0일때만 Z랑 XOR
                result=XOR(Binary_W[j][i],Z[j]); // XOR
                }
                else{   //i=1,2,3이면 구했던 Result_Binary_W를 사용해서 XOR구한다
                    result=XOR(Binary_W[j][i],Result_Binary_W[j][i-1]);
                }
            Result_Binary_W[j][i]=result;        //다음라운드의 키값을 저장한다
            }
        }


        for(int i=0; i<4; i++){
            for(int j=0; j<4; j++){
                W[j][i]=Binary_To_String(Result_Binary_W[j][i]);        //이진수를 문자로 변환해 W에 저장한다
            }
        }


    }

  

   
 
}


int Ascii_To_Int(int num){
    if(48<=num && num<=57){ //전달된 아스키 값이 48~57일때(0~9)
        return num-'0'; // 정수값으로 변환해준다
    }
    else if(65<=num && num<=70){    //전달된 아스키 값이 65~70일때(A~F)
        return num-'A'+10;
    }
    else{   //오류
        cout<<"This is an error";
    }
}

string Char_To_Binary(char c){
    string result;
    switch(c){
        case '0':{
            result="0000";
            break;
        }
        
         case '1':{
            result="0001";
            break;
        }
         case '2':{
            result="0010";
            break;
        }
         case '3':{
            result="0011";
            break;
        }
         case '4':{
            result="0100";
            break;
        }
         case '5':{
            result="0101";
            break;
        }
         case '6':{
            result="0110";
            break;
        }
         case '7':{
            result="0111";
            break;
        }
         case '8':{
            result="1000";
            break;
        }
         case '9':{
            result="1001";
            break;
        }
         case 'A':{
            result="1010";
            break;
        }
         case 'B':{ 
            result="1011";
            break;
        }
         case 'C':{
            result="1100";
            break;
        }
         case 'D':{
            result="1101";
            break;
        }
         case 'E':{
            result="1110";
            break;
        }
         case 'F':{
            result="1111";
            break;
        }

        
    }


    return result;
}

string Binary_To_Char(string str){
    string result;

    if(str=="0000"){
        result="0";
    }
    else if(str=="0001"){
        result="1";
    }
     else if(str=="0010"){
        result="2";
    }
     else if(str=="0011"){
        result="3";
    }
     else if(str=="0100"){
        result="4";
    }
     else if(str=="0101"){
        result="5";
    }
     else if(str=="0110"){
        result="6";
    }
     else if(str=="0111"){
        result="7";
    }
     else if(str=="1000"){
        result="8";
    }
     else if(str=="1001"){
        result="9";
    }
     else if(str=="1010"){
        result="A";
    }
     else if(str=="1011"){
        result="B";
    }
     else if(str=="1100"){
        result="C";
    }
     else if(str=="1101"){
        result="D";
    }
     else if(str=="1110"){
        result="E";
    }
     else if(str=="1111"){
        result="F";
    }

    return result;
}


string String_To_Binary(string str){
    char first=str[0];
    char second=str[1];
    string binary1=Char_To_Binary(first);
    string binary2=Char_To_Binary(second);
  
    string result=binary1+binary2;
    return result;
}

string Binary_To_String(string str){
    string result;
    string first=str.substr(0,4);
    string second=str.substr(4,7);

    string str1=Binary_To_Char(first);
    string str2=Binary_To_Char(second);


    result=str1+str2;
    
    return result;
}


string XOR(string str1, string str2){

    string result;
    for(int i=0; i<8; i++){
        if(str1[i]==str2[i]){   //같으면 0
            result+='0';
        }
        else{   //다르면 1
            result+='1';
        }
    }

    return result;
}

라운드 키 값 구하는 코드

 

반응형

'개념 > 정보보호' 카테고리의 다른 글

정보보호 DES  (0) 2022.09.26
정보보호 1장  (0) 2022.09.05
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함