추천 가젯

OpenSSL 명령어로 대칭 암호화하기 (AES 256 CBC)

OpenSSL

대중적으로 사용되는 여러 종류의 대칭 암호화와 비대칭 암호화 프로토콜을 구현한 오픈 소스 라이브러리로, 관련 분야의 사실상 표준(De Facto Standard)이다.


터미널을 열고, openssl을 입력한 후 엔터 키를 눌러 명령을 실행하면 매우 방대한 양의 사용법을 확인할 수 있다. 만약 설치가 되어 있지 않다면 sudo apt update && sudo apt install openssl -y 명령으로 설치하자.

$openssl                                            
help:

Standard commands
asn1parse         ca                ciphers           cmp
cms               configutl         crl               crl2pkcs7
dgst              dhparam           dsa               dsaparam
ec                ecparam           enc               engine
errstr            fipsinstall       gendsa            genpkey
genrsa            help              info              kdf
list              mac               nseq              ocsp
passwd            pkcs12            pkcs7             pkcs8
pkey              pkeyparam         pkeyutl           prime
rand              rehash            req               rsa
rsautl            s_client          s_server          s_time
sess_id           skeyutl           smime             speed
spkac             srp               storeutl          ts
verify            version           x509

Message Digest commands (see the `dgst' command for more details)
blake2b512        blake2s256        md4               md5
mdc2              rmd160            sha1              sha224
sha256            sha3-224          sha3-256          sha3-384
sha3-512          sha384            sha512            sha512-224
sha512-256        shake128          shake256          sm3

Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb
aes-256-cbc       aes-256-ecb       aria-128-cbc      aria-128-cfb
aria-128-cfb1     aria-128-cfb8     aria-128-ctr      aria-128-ecb
aria-128-ofb      aria-192-cbc      aria-192-cfb      aria-192-cfb1
aria-192-cfb8     aria-192-ctr      aria-192-ecb      aria-192-ofb
aria-256-cbc      aria-256-cfb      aria-256-cfb1     aria-256-cfb8
aria-256-ctr      aria-256-ecb      aria-256-ofb      base64
bf                bf-cbc            bf-cfb            bf-ecb
bf-ofb            camellia-128-cbc  camellia-128-ecb  camellia-192-cbc
camellia-192-ecb  camellia-256-cbc  camellia-256-ecb  cast
cast-cbc          cast5-cbc         cast5-cfb         cast5-ecb
cast5-ofb         des               des-cbc           des-cfb
des-ecb           des-ede           des-ede-cbc       des-ede-cfb
des-ede-ofb       des-ede3          des-ede3-cbc      des-ede3-cfb
des-ede3-ofb      des-ofb           des3              desx
idea              idea-cbc          idea-cfb          idea-ecb
idea-ofb          rc2               rc2-40-cbc        rc2-64-cbc
rc2-cbc           rc2-cfb           rc2-ecb           rc2-ofb
rc4               rc4-40            seed              seed-cbc
seed-cfb          seed-ecb          seed-ofb          sm4-cbc
sm4-cfb           sm4-ctr           sm4-ecb           sm4-ofb

AES란?

openssl에서는 여러 종류의 대칭 키 암호화 방식을 지원한다.

  • AES

  • DES

  • 3-DES

  • ARIA

  • SEED 등

가장 보편적으로 사용하는 암호화 방식은 AES 이다. AES는 '고급 암호화 표준(Advanced Encryption Standard)'의 줄임말로, 미 표준기술연구소에서 연방 정보처리 표준으로 지정되었고 미 국가안보국(NSA)에 의해 1급 기밀에도 사용할 수 있도록 검증된 오픈소스 대칭 키 암호화 알고리즘이다. 현재까지 취약점이 알려지지 않았기 때문에 널리 사용되고 있다. NSA는 취약점을 알고 있다는 루머가 있다.


암호화 키는 128, 192, 256 세 종류가 있다. 이를 각각 AES-128, AES-192, AES-256이라고 한다.


암호화 모드는 CBC, ECB, CFB, OFB, CTR가 있고, 널리 사용되는 모드는 CBC 모드와 CTR 모드가 있다.

AES로 문자열 암호화하기

먼저 문자열을 암호화하고, 그 결과를 다시 복호화해 보겠다.

echo -n "암호화할 문자열" | openssl enc -aes-256-cbc -e -salt -pbkdf2 -a -A -pass pass:"password"

많이 복잡해 보이지만 그리 어렵지 않다.

  • echo -n "암호화할 문자열": 문자열을 출력하되 개행 없이 출력한다.

  • |: 파이프라인으로, echo의 결과를 오른쪽 명령어(openssl)로 옮긴다.

  • openssl enc: openssl로 암호화 기능을 이용한다.

  • -aes-256-cbc: AES 알고리즘을 사용하고, 키 길이는 256비트, CBC 모드를 사용한다.

  • -e: 암호화를 하겠다는 뜻이다.

  • -salt: 암호화를 할 때 무작위 솔트값을 넣어 보안성을 높인다.

  • -pbkdf2: 비밀번호 기반 키 유도 함수(PBKDF2)를 사용하여 솔트와 IV(초기화 벡터)를 사용한다. 비밀번호를 쓴다면 반드시 이 기능을 사용하여야 한다.

  • -a: 결과를 base64 인코딩하여 표시한다.

  • -A: base64 인코딩 결과 이후 줄바꿈을 표시하지 않는다.

  • -pass: 비밀번호를 인라인으로 입력한다. 이 옵션이 없다면 수동으로 입력해야 한다.

결과로 U2FsdGVkX18QXqvziUc1YN9Nx4lzHqPCmrNP/HeBb4KGrHnHyqGDgXR7VRGyi1WZ이 출력되었다. 단, 여러분이 출력한 결과와 이 결과는 아마 다를 것이다. 왜냐하면 -salt 옵션을 통해 솔트를 적용하였으므로 계산할 때마다 결과가 다르다. 다만 복호화는 올바르게 되니 걱정 마라.

AES로 문자열 복호화하기

위에서 계산된 암호문을 원래 평문으로 바꾸는 작업을 복호화라고 한다.

echo -n "U2FsdGVkX18QXqvziUc1YN9Nx4lzHqPCmrNP/HeBb4KGrHnHyqGDgXR7VRGyi1WZ" | openssl enc -aes-256-cbc -d -salt -pbkdf2 -a -A -pass pass:"password"

암호화 할 때와 복호화 할 때의 차이는 -d 옵션이다. 해당 옵션은 'Decrypt'로, 복호화를 하겠다는 뜻이다.

결과로 암호화할 문자열이 출력되는 것을 볼 수 있다.

파일 암복호화

AES로 파일 암호화하기

openssl은 문자열 뿐만 아니라 파일 암호화도 지원한다.

먼저 암호화할 파일을 준비한다. 파일은 텍스트든 이미지든 상관 없다. 필자는 'screenshot.png' 파일을 준비했다.

openssl enc -aes-256-cbc -e -salt -pbkdf2 -in screenshot.png -out encrypted.png -pass pass:"password"
  • -in [입력파일경로]: 입력할 파일을 지정한다. -e 옵션이 있으므로 암호화할 파일의 경로를 지정한다.

  • -out [출력파일경로]: 출력할 파일 이름을 지정한다. 암호화한 결과가 파일로 저장된다.

결과로 encrypted.png 파일이 생성되었다.

이 파일은 암호화된 파일로써 암호가 없다면 이 파일의 원본을 복원하는 것은 사실상 불가능하다. NSA가 몰래 비밀 알고리즘을 넣어 자기들끼리만 복원이 가능하게끔 만들었다는 루머는 있다.

AES로 파일 복호화하기

앞서 만든 encrypted.png 파일을 원본으로 복구할 수 있는 방법은 단 하나, 복호화하는 것이다.

우리는 비밀번호를 알고 있기 때문에, PBKDF2 방식으로 key와 iv, 솔트를 자동으로 계산하여 복호화할 수 있다.

openssl enc -aes-256-cbc -d -salt -pbkdf2 -in encrypted.png -out decrypted.png -pass pass:"password"
  • -in [입력파일경로]: 여기서는 옵션이 -d이므로 암호화할 파일이다.

  • -out [출력파일경로]: 출력할 파일의 경로이다. 복호화니까 출력 결과는 복호화된 파일이다.

결과로 decrypted.png 파일이 생성된다. 이는 원본 파일인 screenshot.png 파일과 완전히 동일하다.

안전성

미국 정부가 1급기밀 암호화 처리에 AES를 채택했다. 그 말은 미국 정부가 이 기술을 믿고 사용한다는 것이다. 앞서 서술하였듯 NSA가 해당 알고리즘의 취약점을 알고 자기들끼리 사용한다는 루머가 있지만 루머일 뿐, 진짜 문제가 있다면 사용하지 않았을 것이다.


현존 암호화 알고리즘 중 AES가 강력한 암호화 알고리즘이고, 키 없이 암호를 해독하는 것이 불가능하다. 특히 소수(Prime Number)를 이용한 비대칭 키 알고리즘이 양자컴퓨터에 취약하다고 하나 AES는 양자컴퓨터에도 안전하다.


암호화 키가 유출되지 않는 한 검찰이든 국과수든 국정원에게 파일이 압수당하더라도 복호화는 불가능하다. 차라리 휘발된 메모리에서 원본 파일을 열어본 흔적을 찾아 열어보는(메모리 포랜식) 게 더 빠를 정도이다.

댓글

가장 많이 본 글