티스토리 뷰
반응형
DES KEY값을 알아내는 과제가 올라왔다
구하는 방법은 강의자료에 나와있다
64비트의 Input key값이 주어지면
각 라운드당 Ci, Di를 알아내고
PC-2를 이용해 알아낸 48비트가 곧 Ki가 된다
이걸 16번 수기로 할려다가 너무 시간이 오래걸려서 그냥 코드로 짰다
반복문은 round1~16까지 돌고
돌면서 각 라운드의 Ci, Di, PC-2를 출력해준다
그러면 PC-2의 비트를 16진수로 바꿔주기만하면 그게 Ki가 된다
알고리즘은 해당 round당 rotate 값을 입력받아
Ci,Di 쉬프트를 rotate만큼해주고
PC-2알고리즘은 일일히 작성해주었다
#include <iostream>
using namespace std;
int main(){
int round=2;
int C[4][7]={{1,1,0,1,0,0,0},
{1,1,1,1,1,1,0},
{0,0,1,0,0,0,1},
{0,0,1,0,1,0,0}
};
int D[4][7]={{0,0,1,0,0,0,1},
{0,0,0,1,0,0,1},
{1,1,1,1,0,1,0},
{0,1,0,1,1,0,0}
};
while(round<=16){
cout<<"round: "<<round<<" ";
int rotate;
cout<<"rotate:";
cin>>rotate;
int C00=C[0][0];
int C01=C[0][1];
int D00=D[0][0];
int D01=D[0][1];
if(rotate==1){ //1만큼 회전
//rotate는 1일때
for(int i=0; i<4; i++){
for(int j=0; j<=6; j++){
if(j==6){ //마지막 열 값 저장
if(i==3){ //마지막행일때는
C[i][j]=C00;
D[i][j]=D00;
continue;
}
C[i][j]=C[i+1][0];
D[i][j]=D[i+1][0];
continue;
}
C[i][j]=C[i][j+rotate];
D[i][j]=D[i][j+rotate];
}
}
}
else if(rotate==2){ //2만큼회전
//rotate는 1일때
for(int i=0; i<4; i++){
for(int j=0; j<=6; j++){
if(j==5){
if(i==3){
C[i][j]=C00;
D[i][j]=D00;
continue;
}
C[i][j]=C[i+1][0];
D[i][j]=D[i+1][0];
continue;
}
else if(j==6){
if(i==3){
C[i][j]=C01;
D[i][j]=D01;
continue;
}
C[i][j]=C[i+1][1];
D[i][j]=D[i+1][1];
continue;
}
C[i][j]=C[i][j+rotate];
D[i][j]=D[i][j+rotate];
}
}
}
for(int i=0; i<4; i++){ //Ci Di 출력
for(int j=0; j<7; j++){
cout<<"C["<<i<<"]["<<j<<"]: "<<C[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
for(int i=0; i<4; i++){
for(int j=0; j<7; j++){
cout<<"D["<<i<<"]["<<j<<"]: "<<D[i][j]<<" ";
}
cout<<endl;
}
int PC2[6][8]; //여기서부터 rotate시켜준 C와 D로 PC-2과정 해준다
PC2[0][0]=C[1][6];
PC2[0][1]=C[2][2];
PC2[0][2]=C[1][3];
PC2[0][3]=C[3][2];
PC2[0][4]=C[0][0];
PC2[0][5]=C[0][4];
PC2[0][6]=C[0][2];
PC2[0][7]=C[3][6];
PC2[1][0]=C[2][0];
PC2[1][1]=C[0][5];
PC2[1][2]=C[2][6];
PC2[1][3]=C[1][2];
PC2[1][4]=C[3][1];
PC2[1][5]=C[2][4];
PC2[1][6]=C[1][4];
PC2[1][7]=C[0][3];
PC2[2][0]=C[3][4];
PC2[2][1]=C[1][0];
PC2[2][2]=C[2][1];
PC2[2][3]=C[0][6];
PC2[2][4]=C[3][5];
PC2[2][5]=C[2][5];
PC2[2][6]=C[1][5];
PC2[2][7]=C[0][1];
PC2[3][0]=D[1][5];
PC2[3][1]=D[3][2];
PC2[3][2]=D[0][2];
PC2[3][3]=D[1][1];
PC2[3][4]=D[2][4];
PC2[3][5]=D[3][5];
PC2[3][6]=D[0][1];
PC2[3][7]=D[1][4];
PC2[4][0]=D[3][1];
PC2[4][1]=D[2][2];
PC2[4][2]=D[0][4];
PC2[4][3]=D[2][5];
PC2[4][4]=D[2][1];
PC2[4][5]=D[2][6];
PC2[4][6]=D[1][3];
PC2[4][7]=D[3][6];
PC2[5][0]=D[0][5];
PC2[5][1]=D[3][3];
PC2[5][2]=D[2][3];
PC2[5][3]=D[1][6];
PC2[5][4]=D[3][0];
PC2[5][5]=D[1][0];
PC2[5][6]=D[0][0];
PC2[5][7]=D[0][3];
cout<<endl;
for(int i=0; i<6; i++){ //PC2출력
for(int j=0; j<8; j++){
cout<<"PC2["<<i<<"]["<<j<<"]: "<<PC2[i][j]<<" ";
}
cout<<endl;
}
round++;
}
return 0;
}
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- oauth
- git 예전 커밋 수정
- DML
- NHN FORWARD
- kloa
- javascript
- 프로그래머스
- authorization code
- 데이터베이스
- CSS
- 로스트아크 캐릭터
- 클로아
- OAuth 개념
- oauth2.0
- html #웹 #웹사이트 #플레이리스트
- DDL
- authorization_code
- 오픈소스
- 데이터 3법
- git
- SQL
- 우분투
- Android Studio
- html
- GNAP
- bfs
- 데이터3법
- SpringBoot
- 리눅스
- git commit 수정
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함