암호화
한 노드(sender)에서 다른 노드(receiver)로 메시지를 전송하려 할 때, 제 3자에게 보여지면 안되는 기밀성이 필요한
메시지일 경우 이를 암호화하여 보내고 받는 상대방이 복호화하는 과정이 필요하다.
이러한 암호화의 가장 간단한 분류인 대칭키(Symmetric key), 공개키(public key) 암호화 알고리즘에 대해 알아보겠다.
대칭키(Symmetric key) 암호화
대칭키는 정보를 교환하고자 하는 두 노드가 서로 공유하는 하나의 비밀 Key를 말한다.
sender가 receiver에게 정보를 전송하기 전에, 이러한 비밀키 Ks를 가지고 있다는 가정에서 출발한다.

위 그림은 대칭키 알고리즘의 암호화, 복호화 과정으로,
Sender와 Receiver가 공유하는 키이자 비밀키 즉 대칭키를 이용하는 것이 해당 알고리즘의 핵심이다.
보내고자 하는 메시지를 m이라 하면, 이를 대칭키로 암호화한 cipher text가 Ks(m)이 된다.
이후 cipher text를 receiver에게 보내고, cipher text를 sender에게서 받은 reveiver는
대칭키를 이용해 Ks(Ks(m)) = m을 얻어낸다.
이를 exclusive or 연산을 이용해 간략히 C++로 구현하여 보았다.
// Symmetric key Stream Ciphers
#include <iostream>
#include <vector>
#include <string>
#include <random>
#include <ctime>
using namespace std;
string generate_Ks(int k){ // 랜덤 Symmetric key 생성
string s = "";
srand((unsigned int)time(NULL));
for (int i = 0; i < k; i++) s += rand()%2 + '0';
return s;
}
string en_decrypt(string txt, string ks){ // 암호화, 복호화 과정이 동일 (exclusive or)
string ans_txt = "";
for (int i = 0; i < txt.size(); i++){
ans_txt += (((int)txt[i]-48)^((int)ks[i]-48))+'0';
}
return ans_txt;
}
int main(){
int a = 1;
char b = '0';
string message;
string keyS;
string decryption_txt;
string encryption_txt;
cout << "input binary code : ";
cin >> message;
keyS = generate_Ks(message.size());
encryption_txt = en_decrypt(message, keyS); // 암호화
decryption_txt = en_decrypt(encryption_txt, keyS); // 복호화
cout << "------------" << endl;
printf("plain text: %s\nsymmetric key: %s\ncipher text: %s\ndecryption text: %s\
\n",message.c_str(), keyS.c_str(), encryption_txt.c_str(), decryption_txt.c_str());
}
output
input binary code : 01010110
------------
plain text: 01010110
symmetric key: 01010011
cipher text: 00000101
decryption text: 01010110
output을 보면 원문인 plain text( 010101110 )가 cipher text( 00000101 )로 바뀌게 되어
암호화를 성공하였다 볼 수 있다. 복호화 과정 역시 암호화와 같은데, 이는 exclusive or 연산에
암호화할 때와 같은 binary code를 적용하였기에 대칭키로 작용한다.
공개키(Public key) 암호화
공개키는 각 노드가 두개의 key를 가진다. 하나는 본인만 알고있는 private키, 다른 하나는 모두에게 알리는 public key이다.
sender는 receiver가 공개한 receiver의 public key를 이용하여 보낼 메시지를 암호화하고, receiver는 이를
본인만 알고 있는 본인의 private key를 사용하여 복호화하는 알고리즘이다.

이러한 공개키 암호화 방식은, 기존 대칭키 암호화 방식의 문제점인
어떻게 key를 공유할 것인가의 문제를 해결할 수단으로 나타났다. 암호문을 복호하는 키가 공유될 때 노출될 위험이 없기에
대칭키 암호화 방식에서 쓰일 대칭키를 전달할 때 쓰이기도 한다. (대칭키 방식이 속도가 공개키보다 빠른 장점이 있기에)
다음 게시글에서 Public key 암호화 알고리즘의 대표적 예시인 RSA 알고리즘에 대하여 자세히 다루도록 하겠다.
암호화 방식은 크게 대칭키(Symmetric key), 공개키(Public key) 알고리즘이 있다.
대칭키 방식은 공유하는 비밀의 key 하나,
공개키는 각 노드마다 공개키, 비밀키를 가지고 암호-복호화를 한다.