분류 기타

OpenSSL로 파일 암호화 및 암호 해독

컨텐츠 정보

  • 조회 380 (작성일 )

본문

OpenSSL은 외부인이 민감하고 비밀 메시지를 열지 못하도록 하는 실용적인 도구입니다.


암호화는 메시지를 암호화하여 내용이 눈에 띄지 않도록 보호하는 방법입니다. 두 가지 일반적인 유형이 있습니다.


  • 비밀 키 또는 대칭 암호화
  • 공개 키 또는 비대칭 암호화

비밀 키 암호화는 암호화 및 복호화에 동일한 키를 사용하는 반면 공개 키 암호화는 암호화 및 복호화에 서로 다른 키를 사용합니다. 각 방법에는 장단점이 있습니다. 비밀 키 암호화는 더 빠르며 공개 키 암호화는 키를 안전하게 공유하는 문제를 해결하기 때문에 더 안전합니다. 함께 사용하면 각 유형의 장점을 최적으로 사용할 수 있습니다.


공개 키 암호화 


공개 키 암호화는 키 쌍이라고 하는 두 세트의 키를 사용합니다. 하나는 공개 키이며 비밀리에 대화하고 싶은 사람과 자유롭게 공유 할 수 있습니다. 다른 하나 인 개인 키는 비밀로 되어 있으며 절대 공유되지 않습니다.


공개 키는 암호화에 사용됩니다. 다른 사람이 중요한 정보를 귀하와 전달하고자 하는 경우 공개 키를 보내어 메시지나 파일을 귀하에게 보내기 전에 암호화하는 데 사용할 수 있습니다. 암호 해독에는 개인 키가 사용됩니다. 보낸 사람의 암호화 된 메시지를 해독 할 수 있는 유일한 방법은 개인 키를 사용하는 것입니다. 따라서 설명자 "key-pair"; 키 세트가 함께 사용됩니다.


OpenSSL로 파일을 암호화하는 방법 


OpenSSL은 파일 암호화를 포함하여 다양한 작업을 수행하는 놀라운 도구입니다. 이 데모는 OpenSSL이 설치된 Fedora 시스템을 사용합니다. 이 도구는 일반적으로 대부분의 Linux 배포판에서 기본적으로 설치됩니다. 그렇지 않은 경우 패키지 관리자를 사용하여 설치할 수 있습니다.


cat /etc/fedora-release
Fedora release 33 (Thirty Three)
$
alice $ openssl version
OpenSSL 1.1.1i FIPS  8 Dec 2020
alice $ 


파일 암호화 및 암호 해독을 탐색하려면 OpenSSL을 사용하여 암호화 된 파일을 교환하여 서로 통신하려는 두 명의 사용자 Alice와 Bob을 상상해보십시오.


1 단계 : 키 쌍 생성 


파일을 암호화하기 전에 키 쌍을 생성해야 합니다. 또한 OpenSSL을 사용할 때마다 사용해야 하는 암호가 필요하므로 기억해야 합니다.


Alice는 다음을 사용하여 키 쌍 세트를 생성합니다.


alice $ openssl genrsa -aes128 -out alice_private.pem 1024 


이 명령은 OpenSSL의 genrsa 명령을 사용하여 1024 비트 공개 / 개인 키 쌍을 생성합니다. 이것은 RSA 알고리즘이 비대칭이기 때문에 가능합니다. 또한 대칭 키 알고리즘인 aes128을 사용하여 Alice가 genrsa를 사용하여 생성하는 개인 키를 암호화합니다.


명령을 입력 한 후 OpenSSL은 Alice가 키를 사용할 때마다 입력해야 하는 암호를 묻는 메시지를 표시합니다.


alice $ openssl genrsa -aes128 -out alice_private.pem 1024
Generating RSA private key, 1024 bit long modulus (2 primes)
..........+++++
..................................+++++
e is 65537 (0x010001)
Enter pass phrase for alice_private.pem:
Verifying - Enter pass phrase for alice_private.pem:
alice $
alice $
alice $ ls -l alice_private.pem
-rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem
alice $
alice $ file alice_private.pem
alice_private.pem: PEM RSA private key
alice $ 


Bob은 동일한 절차에 따라 키 쌍을 만듭니다.


bob $ openssl genrsa -aes128 -out bob_private.pem 1024
Generating RSA private key, 1024 bit long modulus (2 primes)
..................+++++
............................+++++
e is 65537 (0x010001)
Enter pass phrase for bob_private.pem:
Verifying - Enter pass phrase for bob_private.pem:
bob $
bob $ ls -l bob_private.pem
-rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem
bob $
bob $ file bob_private.pem
bob_private.pem: PEM RSA private key
bob $ 


키 파일이 어떻게 생겼는지 궁금하다면 명령이 생성 한 .pem 파일을 열 수 있습니다.하지만 화면에 표시되는 텍스트는 다음과 같습니다.


alice $ head alice_private.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E26FAC1F143A30632203F09C259200B9

pdKj8Gm5eeAOF0RHzBx8l1tjmA1HSSvy0RF42bOeb7sEVZtJ6pMnrJ26ouwTQnkL
JJjUVPPHoKZ7j4QpwzbPGrz/hVeMXVT/y33ZEEA+3nrobwisLKz+Q+C9TVJU3m7M
/veiBO9xHMGV01YBNeic7MqXBkhIrNZW6pPRfrbjsBMBGSsL8nwJbb3wvHhzPkeM
e+wtt9S5PWhcnGMj3T+2mtFfW6HWpd8Kdp60z7Nh5mhA9+5aDWREfJhJYzl1zfcv
Bmxjf2wZ3sFJNty+sQVajYfk6UXMyJIuWgAjnqjw6c3vxQi0KE3NUNZYO93GQgEF
pyAnN9uGUTBCDYeTwdw8TEzkyaL08FkzLfFbS2N9BDksA3rpI1cxpxRVFr9+jDBz
alice $ 


키의 세부 정보를 보려면 다음 OpenSSL 명령을 사용하여 .pem 파일을 입력하고 내용을 표시 할 수 있습니다. 이것은 단일 파일이기 때문에 다른 키를 어디에서 찾을 수 있는지 궁금 할 것입니다. 이것은 좋은 관찰입니다. 공개 키를 얻는 방법은 다음과 같습니다.        


alice $ openssl rsa -in alice_private.pem -noout -text
Enter pass phrase for alice_private.pem:
RSA Private-Key: (1024 bit, 2 primes)
modulus:
    00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99:
    47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc:
    c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47:
    81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f:
    65:d3:36:1d:c1:7d:8b:7d:0f:79:de:80:fc:d2:c0:
    e4:27:fc:e9:66:2d:e2:7e:fc:e6:73:d1:c9:28:6b:
    6a:8a:e8:96:9d:65:a0:8a:46:e0:b8:1f:b0:48:d4:
    db:d4:a3:7f:0d:53:36:9a:7d:2e:e7:d8:f2:16:d3:
    ff:1b:12:af:53:22:c0:41:51
publicExponent: 65537 (0x10001)

<< snip >>

exponent2:
    6e:aa:8c:6e:37:d0:57:37:13:c0:08:7e:75:43:96:
    33:01:99:25:24:75:9c:0b:45:3c:a2:39:44:69:84:
    a4:64:48:f4:5c:bc:40:40:bf:84:b8:f8:0f:1d:7b:
    96:7e:16:00:eb:49:da:6b:20:65:fc:a9:20:d9:98:
    76:ca:59:e1
coefficient:
    68:9e:2e:fa:a3:a4:72:1d:2b:60:61:11:b1:8b:30:
    6e:7e:2d:f9:79:79:f2:27:ab:a0:a0:b6:45:08:df:
    12:f7:a4:3b:d9:df:c5:6e:c7:e8:81:29:07:cd:7e:
    47:99:5d:33:8c:b7:fb:3b:a9:bb:52:c0:47:7a:1c:
    e3:64:90:26
alice $ 


2 단계 : 공개 키 추출 


공개 키는 다른 사람과 자유롭게 공유 할 수 있는 반면 개인 키는 비밀로 유지해야 합니다. 따라서 Alice는 다음 명령을 사용하여 공개 키를 추출하고 파일에 저장해야 합니다.


alice $ openssl rsa -in alice_private.pem -pubout > alice_public.pem
Enter pass phrase for alice_private.pem:
writing RSA key
alice $
alice $ ls -l *.pem
-rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem
-rw-rw-r--. 1 alice alice 272 Mar 22 17:47 alice_public.pem
alice $ 


이전과 동일한 방법으로 공개 키 세부 정보를 볼 수 있지만 이번에는 대신 공개 키 .pem 파일을 입력하십시오.


alice $
alice $ openssl rsa -in alice_public.pem -pubin -text -noout
RSA Public-Key: (1024 bit)
Modulus:
    00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99:
    47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc:
    c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47:
    81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f:
$ 


Bob은 동일한 프로세스에 따라 공개 키를 추출하고 파일에 저장할 수 있습니다.


bob $ openssl rsa -in bob_private.pem -pubout > bob_public.pem
Enter pass phrase for bob_private.pem:
writing RSA key
bob $
bob $ ls -l *.pem
-rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem
-rw-r--r--. 1 bob bob 272 Mar 22 13:51 bob_public.pem
bob $ 


3 단계 : 공개 키 교환 


이러한 공개 키는 Alice와 Bob이 서로 교환 할 때까지 많이 사용되지 않습니다. scp 명령을 사용하여 서로의 워크 스테이션에 키를 복사하는 것을 포함하여 공개 키를 공유하는 여러 방법을 사용할 수 있습니다.


Alice의 공개 키를 Bob의 워크 스테이션으로 보내려면 :


 alice $ scp alice_public.pem bob@bob-machine-or-ip:/path/ 


Bob의 공개 키를 Alice의 워크 스테이션으로 보내려면 :


bob $ scp bob_public.pem alice@alice-machine-or-ip:/path/ 


이제 Alice는 Bob의 공개 키를 가지며 그 반대의 경우도 마찬가지입니다.


alice $ ls -l bob_public.pem
-rw-r--r--. 1 alice alice 272 Mar 22 17:51 bob_public.pem
alice $ 


bob $ ls -l alice_public.pem
-rw-r--r--. 1 bob bob 272 Mar 22 13:54 alice_public.pem
bob $ 


4 단계 : 공개 키로 암호화 된 메시지 교환 


Alice가 Bob과 비밀리에 통신해야 한다고 가정 해보십시오. 그녀는 비밀 메시지를 파일에 작성하고 이를 top_secret.txt에 저장합니다. 이 파일은 일반 파일이므로 누구나 열어서 내용을 볼 수 있습니다. 여기에는 많은 보호가 없습니다.


alice $
alice $ echo "vim or emacs ?" > top_secret.txt
alice $
alice $ cat top_secret.txt
vim or emacs ?
alice $ 


이 비밀 메시지를 암호화하려면 Alice는 openssls -encrypt 명령을 사용해야 합니다. 그녀는 도구에 세 가지 입력을 제공해야 합니다.


  1. 비밀 메시지가 포함 된 파일의 이름
  2. Bob의 공개 키 (파일)
  3. 암호화 된 메시지가 저장 될 파일의 ​​이름

alice $ openssl rsautl -encrypt -inkey bob_public.pem -pubin -in top_secret.txt -out top_secret.enc
alice $
alice $ ls -l top_secret.*
-rw-rw-r--. 1 alice alice 128 Mar 22 17:54 top_secret.enc
-rw-rw-r--. 1 alice alice  15 Mar 22 17:53 top_secret.txt
alice $
alice $ 


암호화 후에도 원본 파일은 여전히 ​​볼 수 있지만 새로 생성 된 암호화 된 파일은 화면에서 의미 없는 것처럼 보입니다. 비밀 메시지가 암호화 되었음을 확신 할 수 있습니다.


alice $ cat top_secret.txt
vim or emacs ?
alice $
alice $ cat top_secret.enc
�s��uM)M&>��N��}dmCy92#1X�q?��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��alice $
alice $
alice $
alice $ hexdump -C ./top_secret.enc
00000000  9e 73 12 8f e3 75 4d 29  4d 26 3e bf 80 4e a0 c5  |.s...uM)M&>..N..|
00000010  7d 64 6d 43 79 39 32 23  31 58 ce 71 f3 ba 95 a6  |}dmCy92#1X.q....|
00000020  c0 c0 76 17 fb f7 bf 4d  ce fc 40 e6 f4 45 7f db  |..v....M..@..E..|
00000030  7e ae c0 31 f8 6b 10 06  7e 26 50 55 b5 05 56 68  |~..1.k..~&PU..Vh|
00000040  48 4c eb 40 5e 50 fe 19  ea 28 a8 b8 7a 13 69 d7  |HL.@^P...(..z.i.|
00000050  4d b0 34 70 d8 65 d5 07  95 67 2b 52 ea 31 aa d4  |M.4p.e...g+R.1..|
00000060  80 b3 a8 ec a1 73 ed a7  f9 17 c3 13 d4 fa c1 71  |.....s.........q|
00000070  5f 38 b9 6c 07 72 81 a6  fe af 43 a6 49 2d c4 ee  |_8.l.r....C.I-..|
00000080
alice $
alice $ file top_secret.enc
top_secret.enc: data
alice $ 


비밀 메시지와 함께 원본 파일을 삭제하여 흔적을 제거하는 것이 안전합니다.


alice $ rm -f top_secret.txt 


이제 Alice는 scp 명령을 사용하여 Bob의 워크 스테이션에 파일을 복사하여 네트워크를 통해 이 암호화 된 파일을 Bob에게 다시 보내야 합니다. 파일이 가로 채더라도 그 내용은 암호화되므로 내용을 공개 할 수 없습니다.


alice $  scp top_secret.enc bob@bob-machine-or-ip:/path/ 


Bob이 일반적인 방법을 사용하여 암호화 된 메시지를 열어 보려고 하면 읽을 수 없습니다.


bob $ ls -l top_secret.enc
-rw-r--r--. 1 bob bob 128 Mar 22 13:59 top_secret.enc
bob $
bob $ cat top_secret.enc
�s��uM)M&>��N��}dmCy92#1X�q?��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��bob $
bob $
bob $ hexdump -C top_secret.enc
00000000  9e 73 12 8f e3 75 4d 29  4d 26 3e bf 80 4e a0 c5  |.s...uM)M&>..N..|
00000010  7d 64 6d 43 79 39 32 23  31 58 ce 71 f3 ba 95 a6  |}dmCy92#1X.q....|
00000020  c0 c0 76 17 fb f7 bf 4d  ce fc 40 e6 f4 45 7f db  |..v....M..@..E..|
00000030  7e ae c0 31 f8 6b 10 06  7e 26 50 55 b5 05 56 68  |~..1.k..~&PU..Vh|
00000040  48 4c eb 40 5e 50 fe 19  ea 28 a8 b8 7a 13 69 d7  |HL.@^P...(..z.i.|
00000050  4d b0 34 70 d8 65 d5 07  95 67 2b 52 ea 31 aa d4  |M.4p.e...g+R.1..|
00000060  80 b3 a8 ec a1 73 ed a7  f9 17 c3 13 d4 fa c1 71  |.....s.........q|
00000070  5f 38 b9 6c 07 72 81 a6  fe af 43 a6 49 2d c4 ee  |_8.l.r....C.I-..|
00000080
bob $ 


5 단계 : 개인 키를 사용하여 파일 암호 해독 


Bob은 OpenSSL을 사용하여 메시지를 해독하여 자신의 역할을 수행해야 하지만 이번에는 -decrypt 명령 줄 인수를 사용합니다. 그는 유틸리티에 다음 정보를 제공해야 합니다.


  1. (앨리스에게서 받은) 암호화 된 파일
  2. Bob의 개인 키 (Bob의 공개 키를 사용하여 암호화되었으므로 복호화 용)
  3. 리디렉션을 통해 해독 된 출력을 저장할 파일 이름

bob $ openssl rsautl -decrypt -inkey bob_private.pem -in top_secret.enc > top_secret.txt
Enter pass phrase for bob_private.pem:
bob $ 


Bob은 이제 Alice가 보낸 비밀 메시지를 읽을 수 있습니다.


bob $ ls -l top_secret.txt
-rw-r--r--. 1 bob bob 15 Mar 22 14:02 top_secret.txt
bob $
bob $ cat top_secret.txt
vim or emacs ?
bob $ 


Bob은 Alice에게 답장해야 하므로 비밀 답장을 파일에 기록합니다.


bob $ echo "nano for life" > reply_secret.txt
bob $
bob $ cat reply_secret.txt
nano for life
bob $ 


6 단계 : 다른 키로 프로세스 반복 


Bob은 메시지를 보내기 위해 Alice가 사용한 것과 동일한 프로세스를 따르지만 메시지가 Alice를 위한 것이므로 Alice의 공개 키를 사용하여 파일을 암호화합니다.


bob $ openssl rsautl -encrypt -inkey alice_public.pem -pubin -in reply_secret.txt -out reply_secret.enc
bob $
bob $ ls -l reply_secret.enc
-rw-r--r--. 1 bob bob 128 Mar 22 14:03 reply_secret.enc
bob $
bob $ cat reply_secret.enc
�F݇��.4"f�1��\��{o԰$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a
                                                 �*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:bob $
bob $
bob $ hexdump -C ./reply_secret.enc
00000000  92 46 dd 87 04 bc a7 2e  34 22 01 66 1a 13 31 db  |.F......4"
.f..1.|
00000010  c4 5c b4 8e 7b 6f d4 b0  24 d2 4d 92 9b 49 7b 35  |.\..{o..$.M..I{5|
00000020  da 7c ee 5c bb 6c cd 82  f1 1b 92 65 f1 8d f2 59  |.|.\.l.....e...Y|
00000030  82 56 81 80 7b 89 07 7c  21 24 63 5e 61 0c ae 2a  |.V..{..|!$c^a..*|
00000040  d4 aa 5c 76 51 8d cf a0  39 04 c1 d7 dc f0 ad 99  |..\vQ...9.......|
00000050  27 ed 8e de d9 ae 02 73  50 e0 dd 27 13 ae 8e 5a  |'......sP..'...Z|
00000060  12 e4 9a 31 57 b3 03 6e  dd e1 16 7f 6b c0 b3 8b  |...1W..n....k...|
00000070  4a cf 30 b8 49 3b 50 38  e0 9f 84 f6 83 da 26 3a  |J.0.I;P8......&:|
00000080
bob $
bob $ # remove clear text secret message file
bob $ rm -f reply_secret.txt 


Bob은 scp를 통해 암호화 된 파일을 Alice의 워크 스테이션으로 다시 보냅니다.


scp reply_secret.enc alice@alice-machine-or-ip:/path/ 


Alice가 일반 도구를 사용하여 읽으려고 하면 암호화 된 텍스트를 이해할 수 없습니다.


alice $
alice $ ls -l reply_secret.enc
-rw-r--r--. 1 alice alice 128 Mar 22 18:01 reply_secret.enc
alice $
alice $ cat reply_secret.enc
�F݇��.4"f�1��\��{o԰$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a
                                                 �*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:alice $
alice $
alice $
alice $ hexdump -C ./reply_secret.enc
00000000  92 46 dd 87 04 bc a7 2e  34 22 01 66 1a 13 31 db  |.F......4"
.f..1.|
00000010  c4 5c b4 8e 7b 6f d4 b0  24 d2 4d 92 9b 49 7b 35  |.\..{o..$.M..I{5|
00000020  da 7c ee 5c bb 6c cd 82  f1 1b 92 65 f1 8d f2 59  |.|.\.l.....e...Y|
00000030  82 56 81 80 7b 89 07 7c  21 24 63 5e 61 0c ae 2a  |.V..{..|!$c^a..*|
00000040  d4 aa 5c 76 51 8d cf a0  39 04 c1 d7 dc f0 ad 99  |..\vQ...9.......|
00000050  27 ed 8e de d9 ae 02 73  50 e0 dd 27 13 ae 8e 5a  |'......sP..'...Z|
00000060  12 e4 9a 31 57 b3 03 6e  dd e1 16 7f 6b c0 b3 8b  |...1W..n....k...|
00000070  4a cf 30 b8 49 3b 50 38  e0 9f 84 f6 83 da 26 3a  |J.0.I;P8......&:|
00000080
alice $ 


따라서 그녀는 OpenSSL로 메시지를 해독합니다. 이번에는 비밀 키를 제공하고 출력을 파일에 저장합니다.


alice $ openssl rsautl -decrypt -inkey alice_private.pem -in reply_secret.enc > reply_secret.txt
Enter pass phrase for alice_private.pem:
alice $
alice $ ls -l reply_secret.txt
-rw-rw-r--. 1 alice alice 14 Mar 22 18:02 reply_secret.txt
alice $
alice $ cat reply_secret.txt
nano for life
alice $ 


OpenSSL에 대해 더 알아보기 


OpenSSL은 암호화 관련 사용 사례를 위한 진정한 Swiss Army 나이프 유틸리티입니다. 파일 암호화 외에도 많은 작업을 수행 할 수 있습니다. 매뉴얼, OpenSSL Cookbook, 자주 묻는 질문 등에 대한 링크가 포함 된 OpenSSL 문서 페이지에 액세스하여 사용할 수 있는 모든 방법을 찾을 수 있습니다. 자세한 내용은 포함 된 다양한 암호화 알고리즘을 사용하여 작동 방식을 확인하십시오.


https://opensource.com/article/21/4/encryption-decryption-openssl