티스토리 뷰
반응형
#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;
}
라운드 키 값 구하는 코드
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 데이터3법
- oauth
- git 예전 커밋 수정
- 데이터베이스
- html #웹 #웹사이트 #플레이리스트
- 데이터 3법
- git
- 클로아
- 리눅스
- oauth2.0
- authorization_code
- 프로그래머스
- CSS
- bfs
- SQL
- authorization code
- html
- kloa
- 우분투
- 오픈소스
- SpringBoot
- infcon 2024
- javascript
- 로스트아크 캐릭터
- 인프콘2024
- DML
- DDL
- git commit 수정
- 2024인프콘
- Android Studio
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함