기본 콘텐츠로 건너뛰기

추천 가젯

OpenSSL 명령어로 비대칭 암호화하기 (공개키로 암호화하고 비밀키로 복호화하기)

비대칭 암호화 암호화 키와 복호화 키가 서로 다른 비대칭 암호의 특징을 이용하여 공개키로 암호화하고 비밀키로 복호화할 수 있다. 우선 이전에 생성한 private.pem 과 public.pem 이 필요하다. 비밀키는 계속 가지고 있고, 통신을 하고자 하는 사람에게 공개키를 전달한다. 그 다음 공개키를 가진 사람이 공개키로 암호화하고, 암호화한 결과를 전달한다. 이 과정은 도청되어도 비밀키를 알아낼 수 없기에 원문을 도청자가 알아낼 수 없다. 원문 준비하기 원본은 다음과 같이 준비한다. 주로 대칭 암호화를 사용할 키를 전달할 때 공개키 암호를 보조하여 사용하므로, 여기서는 키파일을 생성하겠다. echo -n "key=" > key.txt openssl rand -hex 32 >> key.txt echo -n "iv=" >> key.txt openssl rand -hex 16 >> key.txt 그러면 key와 iv가 포함된 파일이 완성된다. 이 파일을 안전하게 전달하기 위해 암호화한다. 공개키로 암호화하기 openssl pkeyutl -encrypt -pubin -inkey [public.pem] -in [key.txt] -out encrypted.bin openssl pkeyutl : openssl에서 제공하는 low-level 공개키/개인키 연산 유틸리티인 pkeyutl 을 이용한다. -encyprt : 암호화를 한다. -pubin : 입력받을 키의 종류를 공개키로 지정한다. -inkey [입력키] : 입력받을 키를 지정한다. 암호화를 할 때는 공개키를 지정한다. 필자는 'public.pem'으로 지정하였다. -in [입력파일] : 입력파일을 지정한다. 암호화를 할 때는 원문을 지정한다. 필자는 위에서 생성한 'key.txt'로 지정하였다. -out [출력파일] : 출력파일을 지정한다. 출력된 결과는 암호문이므로 저장될 이름을 지정한다. 필자는 'e...

[과제] 정도전의 밀본 만들기



"linkedlist.h"

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable : 4996)

struct linked_list {
 char passcode;
 struct linked_list* next;
};
typedef struct linked_list node;
typedef node* link;
"listlib.c"

#include "linkedlist.h"

link createnode(char passcode)
{
 link cur;
 cur = (node*)malloc(sizeof(node));
 if (cur == NULL)
  return NULL;

 cur->passcode = (char *)malloc(sizeof(char));
 cur->passcode = passcode;
 cur->next = NULL;

 return cur;
}

link append(link head, link cur)
{
 link nextnode = head;
 if (head == NULL)
 {
  head = cur;
  return head;
 }
 while (nextnode->next != NULL)
  nextnode = nextnode->next;
 nextnode->next = cur;

 return head;
}

int printlist(link head)
{
 int cnt = 0;
 link nextnode = head;
 while (nextnode != NULL)
 {
  printf("%3d번째 암호는 %c\n", ++cnt, nextnode->passcode);
  nextnode = nextnode->next;
 }
 return cnt;
}
"functionlib.c"

#include "linkedlist.h"

void function(int choice, link head, link cur)
{
 int input = 0;
 char ch;
 link nextnode = head;
 link pre = head;
 link post = NULL;


 switch (choice) {
 case 1:
  printf("몇 번째 단지에 집어넣으시겠습니까? : ");
  scanf("%d", &input);
  if (input < 2)
  {
   printf("정도전의 집 단지는 바꿀 수 없소.\n신성불가침의 영역이오.\n");
   break;
  }
  getchar();
  printf("무슨 암호를 넣으시겠습니까? : ");
  scanf("%c", &ch);
  cur = createnode(ch);
  for (int i = 0; i < input - 2; i++)
   pre = pre->next;
  post = pre->next;
  pre->next = cur;
  cur->passcode = ch;
  cur->next = post;
  break;
 case 2:
  printf("몇 번째 단지를 없애버릴까요? : ");
  scanf_s("%d", &input);
  if (input < 2)
  {
   printf("정도전의 집은 없앨 수 없소.\n");
   break;
  }
  for (int i = 0; i < input - 2; i++)
   pre = pre->next;
  pre->next = pre->next->next;  
  break;
 case 3:
  printlist(head);
  break;
 case 4:
  printf("몇 번째 단지의 정보가 궁금합니까? : ");
  scanf_s("%d", &input);
  for(int i=0; inext;
  printf("%d번째 단지의 암호는 %c입니다.\n", input, nextnode->passcode);
  break;
 default:
  printf("입력 오류 또는 종료 커맨드로 인한 종료.\n");
 }
}
"main.c"

#include "linkedlist.h"

link createnode(char passcode);
link append(link head, link cur);
int function(int choice, link head, link cur);
int printlist(link head);

int main()
{
 char passcode;
 link head = NULL;
 link cur = NULL;
 int choice = 0;

 printf("고려의 혁명을 위한 비밀문자를 입력하고 엔터 누르시오. 0을 누르면 끝입니다.\n");
 while(1)
 {
  scanf_s("%c", &passcode, 1);
  getchar();
  if (passcode == '0')
   break;
  cur = createnode(passcode);
  if (cur == NULL) exit(1);
  head = append(head, cur);
 }
 system("cls");
 while (choice != 5)
 {
  printf("암호가 완성되었습니다. 무얼 하시겠습니까?\n1.단지에 암호 삽입\n2.단지 제거\n3.전체 암호 검색\n4.n번째 단지 암호 검색\n5.종료\n선택하시오 : ");
  scanf_s("%d", &choice);
  function(choice, head, cur);
  printf("\n\n");
 }

 system("pause");
 return 0;
}
실행결과





댓글

가장 많이 본 글