암호학에서 RSA 를 이용한 디지털 서명

LinuxBeginner
지금 연습하기

소개

RSA 를 이용한 디지털 서명 실습에 오신 것을 환영합니다. 디지털 서명은 디지털 메시지나 문서의 **진위성 (authenticity)**과 **무결성 (integrity)**을 검증하는 데 사용되는 암호화 메커니즘입니다. 이는 메시지가 알려진 발신자에 의해 생성되었음 (진위성) 을 보장하고, 전송 중에 변경되지 않았음 (무결성) 을 보장합니다.

본 실습에서는 디지털 서명의 전체 수명 주기에 대한 실습 경험을 쌓게 됩니다. 우리는 암호화 작업을 위한 강력하고 다재다능한 유틸리티인 openssl 명령줄 도구를 사용할 것입니다. 개인 키를 사용하여 서명을 생성하는 방법과 해당 공개 키를 사용하여 서명을 검증하는 방법을 배우게 됩니다. 실습을 마치면 디지털 서명이 우리의 디지털 통신을 어떻게 보호하는지에 대한 실질적인 이해를 갖게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 99%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

디지털 서명 개념

이 단계에서는 디지털 서명의 핵심 개념을 이해하는 것부터 시작하겠습니다. 디지털 서명은 **개인 키 (private key)**를 사용하여 발신자가 생성합니다. 이 키는 비밀로 유지되며 발신자만이 알고 있습니다. 그런 다음 이 서명은 발신자의 해당 **공개 키 (public key)**를 가진 누구나 검증할 수 있습니다.

이 과정은 두 가지 중요한 보안 보장을 제공합니다.

  • 진위성 (Authenticity): 개인 키는 발신자만이 가지고 있으므로, 유효한 서명은 메시지가 해당 발신자로부터 비롯되었음을 증명합니다.
  • 무결성 (Integrity): 서명은 메시지 내용과 수학적으로 연결되어 있습니다. 메시지가 어떤 식으로든 변경되면 서명은 더 이상 유효하지 않게 됩니다.

본 실습을 용이하게 하기 위해 설정 과정에서 이미 RSA 키 쌍 (private.pem(비밀 키) 및 public.pem(공유 가능한 키)) 이 생성되었습니다. 또한 message.txt라는 파일도 생성되었습니다. 준비된 파일을 확인하기 위해 프로젝트 디렉터리의 파일을 나열해 보겠습니다.

터미널에서 다음 명령을 실행하십시오.

ls -l

준비된 파일을 확인해야 합니다.

-rw-rw-r-- 1 labex labex   55 Oct 20 09:20 document.txt
-rw-rw-r-- 1 labex labex   26 Oct 20 09:20 message.txt
-rw------- 1 labex labex 1704 Oct 20 09:20 private.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 09:20 public.pem

이제 키와 메시지가 준비되었으므로 첫 번째 디지털 서명을 생성할 준비가 되었습니다.

개인 키로 메시지 서명하기

이 단계에서는 message.txt 파일에 대한 디지털 서명을 생성합니다. 이 과정은 두 가지 주요 작업으로 구성됩니다. 첫째, 메시지의 암호화 해시 (고정된 크기의 고유한 바이트 문자열) 를 생성하고, 둘째, 해당 해시를 개인 키로 암호화합니다. 그 결과가 디지털 서명이 됩니다.

이 작업을 수행하기 위해 openssl dgst 명령을 사용할 것입니다. message.txt에 서명하기 위해 다음 명령을 실행해 보겠습니다.

openssl dgst -sha256 -sign private.pem -out signature.bin message.txt

이 명령을 분석해 보겠습니다.

  • openssl dgst: OpenSSL 의 다이제스트 (digest) 명령을 호출합니다.
  • -sha256: 메시지 해시를 생성하기 위해 SHA-256 알고리즘을 지정합니다.
  • -sign private.pem: 지정된 개인 키인 private.pem을 사용하여 해시에 서명하도록 OpenSSL 에 지시합니다.
  • -out signature.bin: 결과로 생성된 바이너리 서명이 저장될 출력 파일을 지정합니다.
  • message.txt: 서명할 입력 파일입니다.

명령을 실행한 후 signature.bin이라는 새 파일이 생성됩니다. 이 파일에는 디지털 서명이 포함되어 있습니다. 파일을 다시 나열하여 파일 생성을 확인할 수 있습니다.

ls -l

이제 파일 목록에서 signature.bin을 볼 수 있습니다.

-rw-rw-r-- 1 labex labex   55 Oct 20 09:20 document.txt
-rw-rw-r-- 1 labex labex   26 Oct 20 09:20 message.txt
-rw------- 1 labex labex 1704 Oct 20 09:20 private.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 09:20 public.pem
-rw-rw-r-- 1 labex labex  256 Oct 20 09:26 signature.bin

공개 키로 서명 검증하기

이 단계에서는 서명을 확인하려는 수신자 역할을 수행합니다. 이를 위해 수신자는 세 가지, 즉 원본 메시지 (message.txt), 디지털 서명 (signature.bin), 그리고 발신자의 공개 키 (public.pem) 가 필요합니다.

검증 과정은 서명 과정을 역순으로 진행합니다. OpenSSL 은 공개 키를 사용하여 서명을 복호화하여 원래의 해시를 드러냅니다. 그런 다음 수신한 메시지에 대해 독립적으로 새로운 해시를 계산합니다. 두 해시가 일치하면 서명은 유효합니다.

다시 openssl dgst를 사용하지만 이번에는 -verify 옵션을 사용합니다.

openssl dgst -sha256 -verify public.pem -signature signature.bin message.txt

검증 명령에 대한 설명은 다음과 같습니다.

  • -verify public.pem: 지정된 공개 키 (public.pem) 를 사용하여 서명을 검증하도록 OpenSSL 에 지시합니다.
  • -signature signature.bin: 검증할 서명 파일을 지정합니다.
  • message.txt: 서명이 해당되어야 하는 원본 메시지 파일입니다.

서명이 유효한 경우 OpenSSL 은 다음 메시지를 출력합니다.

Verified OK

이 확인은 두 가지를 의미합니다. 메시지가 확실히 private.pem 키 소유자에 의해 서명되었으며, message.txt의 내용이 서명된 이후로 변경되지 않았다는 것입니다.

개인 키로 파일 서명하기

이 단계에서는 다른 파일에 서명 프로세스를 적용하여 서명 과정을 강화할 것입니다. 이는 서명된 해시가 어떻게 생성되고 사용되는지에 대한 이해를 공고히 하는 데 도움이 될 것입니다. 디렉토리에 document.txt라는 다른 파일이 있습니다. 이제 이 문서에 대한 디지털 서명을 생성할 것입니다.

절차는 2 단계에서 수행한 것과 동일합니다. document.txt의 SHA-256 해시를 생성한 다음, 해당 해시에 private.pem 키로 서명할 것입니다.

서명을 생성하고 document.sig라는 파일에 저장해 보겠습니다.

openssl dgst -sha256 -sign private.pem -out document.sig document.txt

이 명령은 document.txt의 현재 내용에 특화된 새로운 서명 파일인 document.sig를 생성합니다. 문서 내용이 변경되면 새로운 서명을 생성해야 합니다.

document.sig가 생성되었는지 확인하기 위해 파일을 나열해 보겠습니다.

ls

출력에서 새 서명 파일을 볼 수 있어야 합니다.

document.sig  document.txt  message.txt  private.pem  public.pem  signature.bin

이제 서명된 문서가 생겼으며, 다음 단계에서 디지털 서명의 무결성 검증 능력을 시연하는 데 사용할 것입니다.

서명 변조 테스트

마지막 단계에서는 디지털 서명의 가장 중요한 기능인 무결성 보호 기능을 시연할 것입니다. 의도적으로 document.txt 파일에 서명한 후 내용을 변조하고, 원래의 서명으로 검증을 시도해 보겠습니다. 이를 통해 디지털 서명이 무단 수정을 어떻게 방지하는지 확인할 수 있습니다.

먼저, document.txt 파일에 텍스트를 추가해 보겠습니다. 이는 공격자가 문서를 변경하는 상황을 시뮬레이션합니다.

echo "This is an unauthorized change." >> document.txt

이제 document.txt의 내용이 변경되었습니다. 원래 서명인 document.sig는 파일의 이전 내용을 기반으로 생성되었습니다.

이제 수정된 document.txt 파일을 원래 서명인 document.sig와 공개 키를 사용하여 검증해 보겠습니다.

openssl dgst -sha256 -verify public.pem -signature document.sig document.txt

이번에는 검증이 성공하지 못할 것입니다. 대신 다음과 유사한 오류 메시지가 표시됩니다.

Verification failure
805BA484597F0000:error:02000068:rsa routines:ossl_rsa_verify:bad signature:../crypto/rsa/rsa_sign.c:430:
805BA484597F0000:error:1C880004:Provider routines:rsa_verify:RSA lib:../providers/implementations/signature/rsa_sig.c:774:

이 실패는 예상된 결과입니다. 이는 수정된 document.txt의 해시가 더 이상 document.sig 내부에 암호화된 해시와 일치하지 않기 때문에 발생합니다. 이는 파일이 서명된 이후로 변조되었음을 즉시 증명합니다. 이 메커니즘은 디지털 문서 및 통신을 신뢰하는 데 근본적입니다.

요약

본 실습 (lab) 에서는 RSA 와 OpenSSL 을 사용하여 디지털 서명의 실제 적용 방법을 성공적으로 학습했습니다.

전체 프로세스를 단계별로 살펴보았습니다.

  • 디지털 서명이 제공하는 인증 (authenticity) 및 무결성 (integrity) 의 핵심 개념을 이해했습니다.
  • 개인 키 (private.pem) 를 사용하여 메시지에 서명하고 서명 파일을 생성했습니다.
  • 해당 공개 키 (public.pem) 를 사용하여 서명을 검증하고 메시지의 인증을 확인했습니다.
  • 서명된 파일을 의도적으로 변조한 후 Verification failure를 확인하여 디지털 서명이 데이터 무결성을 보호하는 방식을 시연했습니다.

이러한 실습 경험은 디지털 세계에서 신뢰가 어떻게 구축되는지를 이해하는 견고한 기반을 제공하며, 이는 사이버 보안 및 현대 컴퓨팅에서 매우 중요한 개념입니다.