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-ofbAES란?
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는 양자컴퓨터에도 안전하다.
암호화 키가 유출되지 않는 한 검찰이든 국과수든 국정원에게 파일이 압수당하더라도 복호화는 불가능하다. 차라리 휘발된 메모리에서 원본 파일을 열어본 흔적을 찾아 열어보는(메모리 포랜식) 게 더 빠를 정도이다.
댓글
댓글 쓰기