암호학의 대칭 키 암호화 기본 사항

LinuxBeginner
지금 연습하기

소개

대칭 암호화 (Symmetric encryption) 는 암호화와 복호화에 동일한 키를 사용하는 암호학의 기본 개념입니다. 이 방식은 빠르고 효율적이어서 대량의 데이터를 암호화하는 데 이상적입니다.

본 랩 (lab) 에서는 강력한 openssl 명령줄 도구를 사용하여 리눅스 환경에서 대칭 암호화에 대한 실습 경험을 쌓게 됩니다. 여러분은 비밀 키 생성, 텍스트 파일 암호화, 복호화, 그리고 최종적으로 복호화된 파일이 원본과 동일한지 확인하는 전체 과정을 진행하게 됩니다.

대칭 키 암호화 개념

이 단계에서는 대칭 암호화의 핵심 개념을 간략하게 복습하겠습니다. "대칭 (Symmetric)"이라는 의미는 데이터를 잠그는 (암호화하는) 데 사용되는 키와 데이터를 여는 (복호화하는) 데 사용되는 키가 동일하다는 것을 의미합니다.

물리적인 잠금 상자를 상상해 보세요. 열쇠를 사용하여 잠급니다. 다시 열려면 정확히 동일한 열쇠를 사용해야 합니다. 대칭 암호화에서 이 키는 디지털 정보의 조각이며, 데이터를 암호화하고 복호화해야 하는 당사자들 사이에 안전하게 공유되어야 합니다. 이 단일 키가 손상되면 암호화된 데이터의 보안이 상실됩니다.

본 랩에서는 간단한 텍스트 파일을 다룰 것입니다. ~/project 디렉토리에 original.txt라는 파일이 미리 생성되어 있습니다. 내용을 확인하여 이것이 일반적인 읽을 수 있는 텍스트 파일인지 확인할 수 있습니다.

현재 디렉토리의 파일을 나열하여 확인해 보겠습니다.

ls -l

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

-rw-rw-r-- 1 labex labex 26 Oct 20 08:56 original.txt

이제 그 내용을 확인해 보겠습니다.

cat original.txt

출력은 파일 내부의 간단한 텍스트 메시지일 것입니다.

This is a secret message.

다음 단계에서는 이 파일을 암호화하여 읽을 수 없게 만든 다음, 다시 원래 형태로 복호화할 것입니다.

AES 키 생성

이 단계에서는 암호화 프로세스에 사용할 안전하고 무작위적인 키를 생성합니다. 대칭 암호화의 강도는 키의 비밀성과 무작위성에 크게 의존합니다. 예측 가능한 키는 추측하기 쉬워 암호화가 무용지물이 됩니다.

openssl rand 명령을 사용하여 암호학적으로 강력한 무작위 키를 생성할 것입니다. AES(Advanced Encryption Standard) 알고리즘의 표준 길이인 256 비트 키를 생성할 것입니다.

다음 명령을 실행하여 32 바이트 (256 비트) 키를 16 진수 형식으로 생성하고 aes.key라는 파일에 저장합니다.

openssl rand -hex 32 > aes.key

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

  • openssl rand: 무작위 데이터를 생성하는 명령어입니다.
  • -hex: 출력을 16 진수 문자열로 포맷합니다.
  • 32: 생성할 무작위 데이터의 바이트 수를 지정합니다. 각 16 진수 문자는 4 비트 (또는 반 바이트) 를 나타내므로, 32 바이트 데이터는 64 자 길이의 16 진수 문자열이 됩니다.
  • > aes.key: 명령어의 출력을 리디렉션하여 aes.key 파일에 저장합니다.

이제 생성된 키를 확인해 보겠습니다. 키는 무작위로 생성되므로 여러분의 키는 아래 예시와 다를 것임을 기억하십시오.

cat aes.key

256 비트 비밀 키인 긴 16 진수 문자열을 보게 될 것입니다.

2da75d4f284618ed6933d0e743757ed014ba39a1a8aa1879ebbbfe53b92d519a

이제 이 aes.key 파일에 데이터를 암호화하고 복호화하는 데 사용할 비밀 정보가 저장되었습니다.

AES 를 사용하여 파일 암호화

이 단계에서는 생성한 키를 사용하여 original.txt 파일을 암호화합니다. 암호화 및 복호화에 다용도로 사용되는 openssl enc 명령어를 사용할 것입니다.

AES-256-CBC 암호를 사용할 것입니다.

  • AES-256: 256 비트 키를 사용하는 고급 암호화 표준 (Advanced Encryption Standard) 을 나타냅니다.
  • CBC: Cipher Block Chaining 의 약자로, 무작위성을 추가하고 동일한 평문 블록이 동일한 암호문 블록을 생성하지 않도록 보장하는 운영 모드입니다.

파일을 암호화하려면 다음 명령을 실행합니다.

openssl enc -aes-256-cbc -pbkdf2 -salt -in original.txt -out encrypted.dat -pass file:./aes.key

명령어 옵션을 살펴보겠습니다.

  • openssl enc: 암호화 암호 (cipher) 를 위한 명령어입니다.
  • -aes-256-cbc: 사용할 암호화 알고리즘을 지정합니다.
  • -pbkdf2: 사용되지 않도록 경고 (deprecation warnings) 를 방지하기 위해 최신 표준 기반의 암호 기반 키 유도 함수 (PBKDF2) 를 사용합니다.
  • -salt: 암호화 전에 키에 무작위 솔트 (salt) 를 추가합니다. 이는 특정 유형의 공격으로부터 보호하는 중요한 보안 관행입니다.
  • -in original.txt: 암호화할 입력 파일을 지정합니다.
  • -out encrypted.dat: 암호화된 데이터를 저장할 출력 파일 이름을 지정합니다.
  • -pass file:./aes.key: OpenSSL 에게 aes.key 파일에서 비밀번호 (여기서는 대칭 키) 를 읽도록 지시합니다.

명령을 실행한 후 encrypted.dat라는 새 파일이 생성됩니다. 내용을 확인해 보겠습니다.

cat encrypted.dat

출력은 읽을 수 없는 문자의 뒤섞임으로 나타나며, 파일이 암호화되었음을 확인시켜 줍니다.

Salted___Mi72j)NU_nJ_h9s(0]%

이제 비밀 메시지를 성공적으로 암호화했습니다. aes.key 없이는 이 파일을 얻은 누구도 그 내용을 읽을 수 없을 것입니다.

AES 를 사용하여 파일 복호화

이 단계에서는 encrypted.dat 파일을 복호화하여 원래 메시지를 복구합니다. 대칭 암호화이므로 암호화 시 사용했던 것과 동일한 키 (aes.key) 와 동일한 기본 명령어 (openssl enc) 를 사용합니다.

주요 차이점은 OpenSSL 에게 암호화 대신 복호화를 수행하도록 지시하는 -d 플래그가 추가되었다는 점입니다.

파일을 복호화하려면 다음 명령을 실행합니다.

openssl enc -d -aes-256-cbc -pbkdf2 -in encrypted.dat -out decrypted.txt -pass file:./aes.key

이 명령어는 암호화 명령어와 매우 유사합니다.

  • -d: 이 플래그는 입력 파일을 복호화하기를 원함을 지정합니다.
  • -aes-256-cbc: 암호화에 사용된 것과 동일한 암호 (cipher) 를 지정해야 합니다.
  • -pbkdf2: 암호화에 사용된 것과 동일한 키 유도 함수 (key derivation function) 를 사용해야 합니다.
  • -in encrypted.dat: 입력 파일은 이제 암호화된 데이터입니다.
  • -out decrypted.txt: 복호화된 읽을 수 있는 텍스트가 저장될 출력 파일입니다.
  • -pass file:./aes.key: 파일을 암호화하는 데 사용된 것과 동일한 키를 제공합니다.

명령이 완료되면 decrypted.txt라는 새 파일이 생성됩니다. 복호화가 성공했는지 확인하기 위해 내용을 확인해 보겠습니다.

cat decrypted.txt

출력은 original.txt에 있던 것과 정확히 동일한 원래 메시지여야 합니다.

This is a secret message.

축하합니다! 성공적으로 전체 암호화 및 복호화 주기를 완료했습니다.

파일 무결성 확인

마지막 단계에서는 복호화 프로세스가 완벽했으며 decrypted.txt 파일이 original.txt 파일의 정확한 복사본인지 확인합니다. 짧은 메시지의 경우 시각적으로 확인할 수 있지만, 더 큰 파일이나 자동화된 스크립트의 경우 프로그래밍 방식으로 확인하는 것이 필수적입니다.

Linux 의 diff 명령어는 이 작업을 수행하는 데 완벽한 도구입니다. 두 파일을 줄 단위로 비교하고 차이점을 보고합니다. 파일이 동일하면 diff는 아무런 출력을 생성하지 않습니다.

원본 파일과 복호화된 파일을 비교하기 위해 diff 명령을 실행합니다.

diff original.txt decrypted.txt

명령을 실행한 후 메시지 없이 명령 프롬프트로 돌아온다면, 이는 파일이 동일하다는 것을 의미합니다. 이 침묵이 성공의 확인입니다. 이는 암호화 및 복호화 주기 동안 데이터의 무결성이 유지되었음을 증명합니다.

이 실습에서 작업한 모든 파일을 보려면 ls -l을 한 번 더 실행할 수 있습니다.

ls -l

원본 파일, 키, 암호화된 데이터 및 최종 복호화된 파일을 볼 수 있습니다.

-rw-rw-r-- 1 labex labex 65 Oct 20 08:57 aes.key
-rw-rw-r-- 1 labex labex 26 Oct 20 08:57 decrypted.txt
-rw-rw-r-- 1 labex labex 48 Oct 20 08:57 encrypted.dat
-rw-rw-r-- 1 labex labex 26 Oct 20 08:56 original.txt

이를 통해 대칭 암호화의 전체 수명 주기를 성공적으로 관리했음을 확인할 수 있습니다.

요약

본 실습에서는 Linux 환경에서 openssl을 사용하여 대칭 암호화의 기본 사항에 대한 실질적인 경험을 쌓았습니다.

다음과 같이 완전한 암호화 및 복호화 워크플로우를 성공적으로 수행했습니다.

  • 암호화와 복호화 모두에 대해 단일 공유 키 (shared key) 라는 핵심 개념을 배웠습니다.
  • openssl rand를 사용하여 강력한 256 비트 AES 키를 생성했습니다.
  • openssl enc를 사용하여 텍스트 파일을 암호화하여 읽을 수 없게 만들었습니다.
  • 동일한 명령어에 -d 플래그를 사용하여 파일을 원래 상태로 복호화했습니다.
  • 마지막으로 diff 명령어를 사용하여 복호화된 데이터가 원본과 동일한지 프로그래밍 방식으로 확인하여 데이터 무결성을 확인했습니다.

이 실습은 대칭 암호 (symmetric cipher) 가 어떻게 작동하는지, 그리고 데이터를 보호하기 위해 실제로 어떻게 적용되는지에 대한 견고한 기초를 제공합니다.