티스토리 뷰

c언어

DES 구현 2일차

삼전동해커 2020. 11. 10. 12:02

이번에는 헤더파일과 함수파일, 메인파일로 나누어서 저장했다.


헤더파일

#include<stdio.h>

void Binary(char *mes);
char* SimplePBox();
void RoundFunc(char *mes);
void delete(char *arr,int idx);
void DES_func(char *mes);
void Swapper(int LBit[32],int RBit[32]);
void MK_Sbox();


헤더파일은 프로그램에서 사용되는 모든 함수들을 미리 선언해둔 파일이다.


메인 파일

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

#include"header.h"
#include"func.c"
#include"sbox.c"

int main(){
char *p = SimplePBox(); //배열을 리턴하는 SimplePBox를 받아주는 포인터 p 선언
Binary(p); //배열의 주소를 가지고 있는 p를 사용
RoundFunc(p);
DES_func(p);
MK_Sbox();
}


메인 파일은 메인함수가 있는 파일로 필요한 파일들을 포함하고 메인함수에 함수들을 호출한다.



함수 구현 파일

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

//평문을 2진수로 변환하는 Binary 함수
void Binary(char *mes){ //char *mes = p
char bit[512]; //bit배열에 비트값을 받음
for(int i=0;i<64;i++){
for(int j=0;j<512;j++){
if(j%8==0){
bit[j]=mes[i]/128;
}
if(j%8==1){
bit[j]=mes[i]/64;
}
if(j%8==2){
bit[j]=mes[i]/32;
}
if(j%8==3){
bit[j]=mes[i]/16;
}
if(j%8==4){
bit[j]=mes[i]/8;
}
if(j%8==5){
bit[j]=mes[i]/4;
}
if(j%8==6){
bit[j]=mes[i]/2;
}
if(j%8==7){
mes[i]=mes[i]%2; //마지막 값은 걍 2로 나눈값과 같다.
bit[j]=mes[i];
}
//printf("%d ",bit[j]);
}
}
}

//단순 P박스 구현. rand_mes배열에 1~64 값 랜덤 할당 후 배열 리턴
//배열을 리턴해야하므로 char* 리턴형, 포인터인 이유는 배열의 주소값을 리턴하기 위해
char* SimplePBox(){
srand((unsigned int)time(0)); //랜덤 함수의 시드값 설정
static char rand_mes[64]; //정적 변수 선언으로 지역변수의 값을 초기화하지 않고 값을 그대로 사용
for(int j = 0 ; j < 64 ; j++){
rand_mes[j]=rand()%64; //랜덤 값 할당
//printf("배열 출력 \n%d ",rand_mes[j]);
}
printf("\n");
return rand_mes; //배열 리턴
}

//char *mes라는 포인터 선언
//라운드 함수 구현. 16라운드 돌려야함.
void RoundFunc(char *mes){
char LBit[32];
char RBit[32];

//generate l32
printf("LBIT 출력\n");
for(int i=0;i<32;i++){
LBit[i]=mes[i];
printf("%d ",LBit[i]);
}
printf("\n");

//for문 대신 재귀함수를 사용?
//generate r32
printf("RBIT 출력\n");
for(int i=32;i<64;i++){
RBit[i-32]=mes[i];
printf("%d ",RBit[i-32]);
}
printf("\n");
}

void delete(char *arr,int idx){
memmove(arr+idx,arr+idx+1,strlen(arr)-idx);
}
//DES 함수 키랑 xor연산 해야함.
void DES_func(char *mes){
int v=0;
char EX_RBit[48];
EX_RBit[0]=mes[31];
for(int j=1;j<48;j+=6){
for(int i=0;i<4;i++){
EX_RBit[j+i]=mes[v];
v++;
}
}
v=0;
for(int k=5;k<48;k+=6){
EX_RBit[k]=mes[4*v];
v++;

}
printf("\n");
printf("EX_RBit 출력\n");
for(int t=0;t<48;t++){
printf("%d ",EX_RBit[t]);
}
char *key = malloc(sizeof(char));
srand((unsigned int)time(0));
for(int m=0;m<64;m++){
key[m]=rand()%64;
}


for(int n=7;n<63;n+=8){
delete(key,n);
}

free(key);

}

//lbit와 rbit자리 바꿔주는 함수
void Swapper(int LBit[32],int RBit[32]){
//int EN_LBit[32]=RBit[32];
//int EN_RBit[32]=
}


함수 구현파일에는 일단 대부분의 함수를 구현해 놨다.

나중에 이것도 함수별로 구분할 생각이다.


Sbox 파일

#include<stdio.h>
#include<stdlib.h>

char tohex(int ten){
char hex;
char na=ten%16;
if(na>=10)
hex=87+na;
return hex;
}


void MK_Sbox(){
char s[8][5][17];
for(int i = 0 ; i < 8 ; i++){
for(int j = 0 ; j < 1 ; j++){
for(int k = 1 ; k < 18 ; k++){
s[i][j][k]=k;
}
}

int col=0;
for(int u=0;u<4;u++){
for(int k=1;k<5;k++){
s[u][k][0]=col;
col++;
}
}

s[0][1][1]=14;s[0][1][2]=4;s[0][2][3]=13;s[0][1][4]=1;s[0][1][5]=2;s[0][1][6]=15;s[0][1][7]=11;s[0][1][8]=8;s[0][2][9]=3;s[0][1][10]=10;s[0][1][11]=6;s[0][1][12]=12;s[0][1][13]=5;s[0][1][14]=9;s[0][1][15]=0;s[0][1][16]=7;
s[0][2][1]=0;s[0][2][2]=15;s[0][2][3]=7;s[0][2][4]=4;s[0][2][5]=14;s[0][2][6]=2;s[0][2][7]=13;s[0][2][8]=1;s[0][2][9]=10;s[0][2][10]=6;s[0][2][11]=12;s[0][2][12]=11;s[0][2][13]=9;s[0][2][14]=5;s[0][2][15]=3;s[0][2][16]=8;
s[0][3][1]=4;s[0][3][2]=1;s[0][3][3]=14;s[0][3][4]=8;s[0][3][5]=13;s[0][3][6]=6;s[0][3][7]=2;s[0][3][8]=11;s[0][3][9]=15;s[0][3][10]=12;s[0][3][11]=9;s[3][2][12]=7;s[0][3][13]=3;s[0][3][14]=10;s[0][3][15]=5;s[0][3][16]=0;
s[0][4][1]=15;s[0][4][2]=12;s[0][4][3]=8;s[0][4][4]=2;s[0][4][5]=4;s[0][4][6]=9;s[0][4][7]=7;s[0][4][8]=5;s[0][4][9]=11;s[0][4][10]=3;s[0][4][11]=3;s[0][4][12]=14;s[0][4][13]=10;s[0][4][14]=0;s[0][4][15]=6;s[0][4][16]=13;
}
}


sbox파일은 먼저 따로 구현했다. 


얼른 마무리하자.

'c언어' 카테고리의 다른 글

정적 변수 사용하기  (0) 2020.11.10
배열 리턴하기  (0) 2020.11.10
DES 구현 1일차  (0) 2020.11.05
main함수 argc,argv인자에 대하여  (0) 2020.08.30
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함