c언어 - 시저암호
//====================
# include <stdio.h>
# include <math.h>
# include <stdlib.h>
# include <string.h>
# include <time.h>
# include <stdbool.h>
# define TEXT_LEN 80
# define ALPHA_LEN 26
# define ERROR 1
//====================
typedef struct _CEA {
char plainText[TEXT_LEN]; // 평문
char cipherText[TEXT_LEN]; // 암호문
char decryptText[TEXT_LEN]; // 복호문
char alpha[ALPHA_LEN];
int secretKey;
}CEA, *ptrCea;
//====================
void init(CEA** param); // func.0
bool plainTextWrite(CEA** param); // func.1
void encryptText(CEA** param); // func.2
void generatorKey(CEA** param); // func.3
void decryptText(CEA** param); // func.4
//====================
int main(void) {
ptrCea mNode = (ptrCea)malloc(sizeof(CEA));
bool result; // true , false
if (mNode == NULL) {
printf("malloc error ... !!!\n");
return ERROR;
}
else {
// mNode != NULL
result = plainTextWrite(&mNode);
if (result == true) {
generatorKey(&mNode);
encryptText(&mNode);
decryptText(&mNode);
if (!strcmp(mNode->plainText, mNode->decryptText)) {
printf("success ... !!!\n");
}
else {
printf("fail ... !!!\n");
}
}
}
free(mNode);
return 0;
} // end of main function
//====================
void init(CEA** param) { // func.0
// data init
strcpy((** param).plainText, "\0");
strcpy((** param).cipherText, "\0");
strcpy((** param).decryptText, "\0");
strcpy((** param).alpha, "\0");
(** param).secretKey = 0;
} // end of init function
//====================
bool plainTextWrite(CEA** param) { // func.1
unsigned int i; // index
printf("plainText input : ");
fgets((** param).plainText, TEXT_LEN, stdin);
(** param).plainText[strlen((** param).plainText) - 1] = '\0';
system("cls");
printf("입력한 평문은 [%s] 입니다.\n", (** param).plainText);
for (i = 0; i < strlen((** param).plainText); i++) {
if ((** param).plainText[i] < (int)('A') || (** param).plainText[i] > (int)('Z')) {
return false;
}
}
return true;
} // end of plainTextWrite function
//====================
void encryptText(CEA** param) { // func.2
int i,j,k = 0; // index
int mv;
char indx = (int)('A');
for (i = 0; i < 26; i++) {
(** param).alpha[i] = indx;
indx++;
} // end for_1
for (i = 0; i < 26; i++) {
printf("%c", (** param).alpha[i]);
if (i != 25) {
printf(" ");
}
} // end for_2
printf("\n"); // 개행
for (j = 0; j < strlen((** param).plainText); j++) {
for (i = 0; i < 26; i++) {
if ((** param).plainText[j] == (** param).alpha[i]) {
mv = (i + (** param).secretKey) % 26;
//printf("index => %d\n", i);
(** param).cipherText[k] = (** param).alpha[mv];
//printf("(** param).cipherText[%d] => %c\n", k,(** param).cipherText[k]);
k++;
}
} // for_1
} // for_2
(** param).cipherText[k] = '\0';
printf("cipherText is [%s]\n", (** param).cipherText);
} // end of encryptText function
//====================
void generatorKey(CEA** param) { // func.3
srand((unsigned)time(NULL));
(** param).secretKey = rand() % 26;
printf("secretKey => %d\n", (** param).secretKey);
} // end of generatorKey function
//====================
void decryptText(CEA** param) { // func.4
int i, k = 0; // index
unsigned int j;
int mv;
for (j = 0; j < strlen((** param).cipherText); j++) {
for (i = 0; i < 26; i++) {
if ((** param).cipherText[j] == (** param).alpha[i]) {
mv = (i - (** param).secretKey);
if (mv < 0) {
mv += 26;
}
else {
mv %= 26;
}
//printf("index => %d\n", i);
(** param).decryptText[k] = (** param).alpha[mv];
//printf("(** param).cipherText[%d] => %c\n", k,(** param).cipherText[k]);
k++;
}
} // for_1
} // for_2
(** param).decryptText[k] = '\0';
printf("decryptText is [%s]\n", (** param).decryptText);
}// end of decryptText function