소개
본 실습에서는 현대 암호학의 초석인 비대칭 암호화 (asymmetric encryption) 의 원리를 탐구합니다. 대칭 암호화 (symmetric encryption) 가 암호화와 복호화에 단일 키를 사용하는 것과 달리, 비대칭 암호화는 공개 키 (public key) 와 개인 키 (private key) 한 쌍을 사용합니다.
공개 키는 암호화에 사용되며 누구나 공유할 수 있습니다. 개인 키는 비밀로 유지되며 복호화에 사용됩니다. 이 메커니즘을 통해 사전에 비밀 키를 공유할 필요 없이 안전한 통신이 가능해집니다.
본 과정에서는 널리 채택된 RSA 알고리즘과 강력한 openssl 명령줄 도구를 사용하여 이 프로세스를 시연할 것입니다. 공개 키로 메시지를 암호화하고 개인 키로 복호화하는 방법을 배우게 됩니다. 모든 작업은 ~/project 디렉토리 내의 터미널에서 수행됩니다.
비대칭 암호화 기본 원리
이 단계에서는 공개 키 암호화 (public-key cryptography) 라고도 불리는 비대칭 암호화의 핵심 개념을 학습합니다. 이 단계는 실행할 명령이 없는 개념적인 단계이지만, 이후 실습 작업을 위해서는 이러한 원리를 이해하는 것이 매우 중요합니다.
비대칭 암호화는 수학적으로 연결되어 있지만 서로 다른 두 개의 키에 의존합니다.
공개 키 (Public Key): 이 키는 모든 사람에게 공개됩니다. 주요 기능은 데이터를 암호화하는 것입니다. 공개 키를 가진 사람은 누구나 메시지를 암호화할 수 있지만, 그 키를 사용하여 동일한 메시지를 복호화할 수는 없습니다. 이는 누구나 편지를 넣을 수 있는 열린 우편함 투입구와 같다고 생각할 수 있습니다.
개인 키 (Private Key): 이 키는 소유자가 비밀로 안전하게 보관해야 합니다. 이 키의 기능은 해당 공개 키로 암호화된 데이터를 복호화하는 것입니다. 개인 키를 가진 사람만이 메시지를 복호화할 수 있습니다. 우편함 비유에서 개인 키는 우편함을 열고 편지를 꺼낼 수 있는 고유한 열쇠입니다.
이러한 단방향 관계는 안전하지 않은 네트워크를 통한 안전한 통신의 기반이 됩니다. 다음 단계에서는 자신만의 공개/개인 키 쌍을 생성하고 이를 사용하여 메시지를 암호화하고 복호화할 것입니다.
RSA 키 쌍 생성
이 단계에서는 openssl 명령줄 도구를 사용하여 RSA 키 쌍을 생성합니다. 이 명령은 개인 키와 공개 키 구성 요소를 모두 포함하는 단일 파일을 생성합니다.
터미널에서 다음 명령을 실행하십시오. 이 실습의 모든 명령은 기본 ~/project 디렉토리에서 실행해야 합니다.
openssl genrsa -out private.pem 2048
이 명령을 분석해 보겠습니다.
openssl: OpenSSL 툴킷을 호출하는 명령어입니다.genrsa: RSA 개인 키를 생성하기 위한 특정 명령어입니다.-out private.pem: 이 플래그는 키의 출력 파일 이름을 지정합니다. 여기서는private.pem으로 지정합니다.2048: 이는 키의 길이를 비트 단위로 나타냅니다. 2048 비트는 RSA 키에 대한 표준적이고 안전한 길이입니다.
이제 ls 명령을 사용하여 현재 디렉토리에 private.pem 파일이 생성되었는지 확인합니다.
ls
출력에서 private.pem이 나열된 것을 확인해야 합니다.
private.pem
공개 키 추출
이 단계에서는 생성한 private.pem 파일에서 공개 키를 추출합니다. 개인 키 파일에는 필요한 모든 구성 요소가 포함되어 있지만, 메시지 암호화를 위해 다른 사람과 안전하게 공유할 수 있는 별도의 공개 키 파일이 필요합니다.
공개 키를 추출하려면 다음 명령을 사용합니다.
openssl rsa -in private.pem -pubout -out public.pem
명령어 분석은 다음과 같습니다.
openssl rsa: RSA 키 처리에 사용되는 명령어입니다.-in private.pem: 입력 파일 (우리의 개인 키) 을 지정합니다.-pubout: 이 플래그는openssl에게 키의 공개 부분을 추출하여 출력하도록 지시합니다.-out public.pem: 공개 키의 출력 파일 이름을 지정합니다.
명령을 실행하면 작업이 성공했음을 확인하는 짧은 출력이 나타납니다.
writing RSA key
이제 디렉토리의 파일을 다시 나열하여 개인 키와 공개 키를 모두 확인합니다.
ls
이제 private.pem과 public.pem이 모두 보여야 합니다.
private.pem public.pem
공개 키 파일의 내용을 볼 수 있습니다. 이는 PEM 형식의 텍스트 파일입니다.
cat public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
...
-----END PUBLIC KEY-----
공개 키로 메시지 암호화
이 단계에서는 비밀 메시지를 생성한 다음 방금 추출한 공개 키를 사용하여 이를 암호화합니다. 해당 개인 키를 가진 사람만이 이 메시지를 해독할 수 있습니다.
먼저, 비밀 메시지를 포함하는 간단한 텍스트 파일을 생성해 보겠습니다.
echo "This is a secret message." > message.txt
이 명령은 지정된 내용으로 message.txt라는 파일을 생성합니다. 이제 공개 키를 사용하여 이 파일을 암호화해 보겠습니다.
openssl pkeyutl -encrypt -pubin -inkey public.pem -in message.txt -out encrypted.bin
이 명령을 살펴보겠습니다.
openssl pkeyutl: 암호화 및 해독과 같은 공개 키 작업을 수행하는 유틸리티입니다.-encrypt: 암호화 작업을 수행하려는 것임을 지정합니다.-pubin: 입력 키 (-inkey) 가 공개 키임을 나타냅니다.-inkey public.pem: 암호화에 사용할 공개 키를 지정합니다.-in message.txt: 평문 메시지를 포함하는 입력 파일입니다.-out encrypted.bin: 암호화된 데이터 (암호문) 가 저장될 출력 파일입니다.
명령을 실행한 후 새 파일 encrypted.bin이 생성됩니다. 이 파일의 내용을 보려고 하면 메시지가 암호화된 형태인 읽을 수 없는 바이너리 데이터가 표시됩니다.
cat encrypted.bin
출력은 메시지가 암호화되었음을 확인하는 깨진 문자열이 될 것입니다.
개인 키로 메시지 복호화
마지막 단계에서는 개인 키를 사용하여 암호화된 메시지를 해독하여 원래의 평문을 복구합니다. 이는 개인 키 소유자만이 비밀 정보에 접근할 수 있음을 보여줍니다.
encrypted.bin을 해독하려면 다음 명령을 사용합니다.
openssl pkeyutl -decrypt -inkey private.pem -in encrypted.bin -out decrypted.txt
명령 옵션을 검토해 보겠습니다.
openssl pkeyutl: 이전과 동일한 유틸리티입니다.-decrypt: 이번에는 해독 작업을 지정합니다.-inkey private.pem: 해독에 사용할 개인 키를 지정합니다.-in encrypted.bin: 암호화된 암호문을 포함하는 입력 파일입니다.-out decrypted.txt: 복구된 평문이 저장될 출력 파일입니다.
이 명령은 decrypted.txt라는 새 파일을 생성합니다. 해독이 성공했는지 확인하려면 이 새 파일의 내용을 표시합니다.
cat decrypted.txt
원래 메시지가 완벽하게 복원된 것을 볼 수 있습니다.
This is a secret message.
축하합니다! RSA 와 OpenSSL 을 사용하여 비대칭 암호화 및 해독 주기를 성공적으로 완료했습니다.
요약
본 실습 (lab) 을 통해 RSA 알고리즘과 OpenSSL 툴킷을 사용하여 비대칭 암호화에 대한 실질적인 경험을 쌓았습니다.
통신 보안에서 공개 키와 개인 키의 근본적인 차이점과 각 키의 역할을 학습했습니다.
구체적으로 다음과 같은 핵심 기술을 연습했습니다.
openssl genrsa를 사용하여 2048 비트 RSA 키 쌍 생성하기.openssl rsa를 사용하여 개인 키 파일에서 공개 키 추출하기.openssl pkeyutl을 사용하여 공개 키로 평문 메시지 암호화하기.openssl pkeyutl을 사용하여 해당 개인 키로 결과 암호문 해독하기.
이러한 기술은 보안 웹 브라우징 (HTTPS) 부터 암호화된 이메일 및 디지털 서명에 이르기까지 다양한 애플리케이션에서 보안 시스템을 이해하고 구현하는 데 기본이 됩니다.



