본문 바로가기

리눅스

OpenSSL을 사용하여 파일을 암호화하고 복호화하는 방법

728x90

OpenSSL을 사용하여 파일을 암호화하고 복호화하는 방법

OpenSSL은 암호화 및 복호화를 수행할 수 있는 강력한 도구 중 하나입니다.

테스트 환경

  • 운영체제 버전 및 BIT
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

$ getconf LONG_BIT
64
  • OpenSSL 버전
$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

참고: 아래의 예제에서는 대칭 키(암호화 및 복호화에 사용되는 키)를 생성하고 파일을 암호화하는 방법을 설명합니다. 이 예제에서 사용된 대칭 암호화 알고리즘은 AES (Advanced Encryption Standard)입니다.

 

1. 대칭 키 생성

먼저 대칭 키를 생성합니다. 이 키는 암호화와 복호화에 사용됩니다. 아래 명령어로 대칭 키를 생성합니다.

openssl rand -base64 32 > mykey.txt

이 명령은 32바이트 (256비트)의 무작위 키를 생성하고 "mykey.txt" 파일에 저장합니다. 이 키는 파일을 암호화하고 복호화하는 데 사용됩니다.

 

2. 파일 암호화

암호화하려는 파일과 생성한 대칭 키를 사용하여 파일을 암호화합니다. 아래 명령어를 사용합니다.

openssl enc -aes-256-cbc -salt -in plaintext.txt -out encrypted.bin -pass file:mykey.txt
  • -aes-256-cbc: AES 알고리즘을 사용하여 256비트 대칭 암호화를 수행합니다.
  • -salt: 암호화에 솔트를 사용하여 보안을 강화합니다.
  • -in plaintext.txt: 암호화할 원본 파일입니다.
  • -out encrypted.bin: 암호화된 결과를 저장할 파일입니다.
  • -pass file:mykey.txt: 암호화에 사용할 대칭 키 파일을 지정합니다.

 

3. 복호화

암호화된 파일을 복호화하려면 다음 명령어를 사용합니다.

openssl enc -d -aes-256-cbc -in encrypted.bin -out decrypted.txt -pass file:mykey.txt
  • -d: 복호화 모드로 작동합니다.
  • -aes-256-cbc: 이전과 동일한 AES 알고리즘 및 모드를 사용합니다.
  • -in encrypted.bin: 복호화할 파일입니다.
  • -out decrypted.txt: 복호화된 결과를 저장할 파일입니다.
  • -pass file:mykey.txt: 복호화에 사용할 대칭 키 파일을 지정합니다.
728x90

지원되는 Ciphers(Cipher Types|Valid ciphername values)

openssl enc -ciphers(? 알 수 없는 옵션으로 정상적인 옵션을 출력했다)

$ openssl enc -ciphers
unknown option '-ciphers'
options are
-in <file>     input file
-out <file>    output file
-pass <arg>    pass phrase source
-e             encrypt
-d             decrypt
-a/-base64     base64 encode/decode, depending on encryption flag
-k             passphrase is the next argument
-kfile         passphrase is the first line of the file argument
-md            the next argument is the md to use to create a key
                 from a passphrase. See openssl dgst -h for list.
-S             salt in hex is the next argument
-K/-iv         key/iv in hex is the next argument
-[pP]          print the iv/key (then exit if -P)
-bufsize <n>   buffer size
-nopad         disable standard block padding
-engine e      use engine e, possibly a hardware device.
Cipher Types
-aes-128-cbc               -aes-128-cbc-hmac-sha1     -aes-128-cbc-hmac-sha256
-aes-128-ccm               -aes-128-cfb               -aes-128-cfb1
-aes-128-cfb8              -aes-128-ctr               -aes-128-ecb
-aes-128-gcm               -aes-128-ofb               -aes-128-xts
-aes-192-cbc               -aes-192-ccm               -aes-192-cfb
-aes-192-cfb1              -aes-192-cfb8              -aes-192-ctr
-aes-192-ecb               -aes-192-gcm               -aes-192-ofb
-aes-256-cbc               -aes-256-cbc-hmac-sha1     -aes-256-cbc-hmac-sha256
-aes-256-ccm               -aes-256-cfb               -aes-256-cfb1
-aes-256-cfb8              -aes-256-ctr               -aes-256-ecb
-aes-256-gcm               -aes-256-ofb               -aes-256-xts
-aes128                    -aes192                    -aes256
-bf                        -bf-cbc                    -bf-cfb
-bf-ecb                    -bf-ofb                    -blowfish
-camellia-128-cbc          -camellia-128-cfb          -camellia-128-cfb1
-camellia-128-cfb8         -camellia-128-ecb          -camellia-128-ofb
-camellia-192-cbc          -camellia-192-cfb          -camellia-192-cfb1
-camellia-192-cfb8         -camellia-192-ecb          -camellia-192-ofb
-camellia-256-cbc          -camellia-256-cfb          -camellia-256-cfb1
-camellia-256-cfb8         -camellia-256-ecb          -camellia-256-ofb
-camellia128               -camellia192               -camellia256
-cast                      -cast-cbc                  -cast5-cbc
-cast5-cfb                 -cast5-ecb                 -cast5-ofb
-des                       -des-cbc                   -des-cfb
-des-cfb1                  -des-cfb8                  -des-ecb
-des-ede                   -des-ede-cbc               -des-ede-cfb
-des-ede-ofb               -des-ede3                  -des-ede3-cbc
-des-ede3-cfb              -des-ede3-cfb1             -des-ede3-cfb8
-des-ede3-ofb              -des-ofb                   -des3
-desx                      -desx-cbc                  -id-aes128-CCM
-id-aes128-GCM             -id-aes128-wrap            -id-aes128-wrap-pad
-id-aes192-CCM             -id-aes192-GCM             -id-aes192-wrap
-id-aes192-wrap-pad        -id-aes256-CCM             -id-aes256-GCM
-id-aes256-wrap            -id-aes256-wrap-pad        -id-smime-alg-CMS3DESwrap
-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                    -rc4-hmac-md5
-rc5                       -rc5-cbc                   -rc5-cfb
-rc5-ecb                   -rc5-ofb                   -seed
-seed-cbc                  -seed-cfb                  -seed-ecb
-seed-ofb

[MAC] openssl enc -help 명령어

$ openssl enc -help
usage: enc -ciphername [-AadePp] [-base64] [-bufsize number] [-debug]
    [-in file] [-iv IV] [-K key] [-k password]
    [-kfile file] [-md digest] [-none] [-nopad] [-nosalt]
    [-out file] [-pass arg] [-S salt] [-salt]

암호화하는 명령어(encryption)

-e Encrypt the input data (default)

$ file ldap-20210705.tar.gz
ldap-20210705.tar.gz: gzip compressed data, from Unix, last modified: Mon Jul  5 21:28:50 2021
$ openssl enc -aes-128-cbc -in ldap-20210705.tar.gz -out enc_ldap-20210705.tar.gz -K 1234 -iv 00000000000000000000000000000000
$ file enc_ldap-20210705.tar.gz
enc_ldap-20210705.tar.gz: data

복호화하는 명령어(decryption)

-d Decrypt the input data

$ openssl enc -d -aes-128-cbc -in enc_ldap-20210705.tar.gz -out dec_ldap-20210705.tar.gz -K 1234 -iv 00000000000000000000000000000000
$ file dec_ldap-20210705.tar.gz
dec_ldap-20210705.tar.gz: gzip compressed data, from Unix, last modified: Mon Jul  5 21:28:50 2021

복호화 에러

패스워드가 다른 경우

$ openssl enc -d -aes-128-cbc -in enc_ldap-20210705.tar.gz -out dec_ldap-20210705.tar.gz -K 12345 -iv 00000000000000000000000000000000
bad decrypt
139841944201104:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:592:

HEX가 다른 경우

$ openssl enc -d -aes-128-cbc -in enc_ldap-20210705.tar.gz -out dec_ldap-20210705.tar.gz -K 1234 -iv 00000000000000000000000000000011

$ tar xvfz dec_ldap-20210705.tar.gz

gzip: stdin: invalid compressed data--format violated
tar: Child returned status 1
tar: Error is not recoverable: exiting now

 

이제 파일이 암호화되고 복호화되었습니다. 암호화 키는 안전하게 보관되어야 하며 복호화를 원하는 사람만 액세스할 수 있어야 합니다.

 

728x90