언어/c언어

c언어 - 시저암호

파아랑새 2018. 1. 4. 00:15

//====================
# 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