관리 메뉴

멍개의 연구소

[gpg] gpg를 이용하여 RSA(공개키 암호화)방식 이해 본문

블록체인

[gpg] gpg를 이용하여 RSA(공개키 암호화)방식 이해

멍개. 2022. 8. 27. 16:04

IPFS를 공부하고 있는데 IPFS에서는 파일을 저장한 후 해시값을 통해서 파일을 다운로드할 수 있습니다. 여기서 문제는 IPFS 자체적으로 보안을 해결할 수 없습니다.
예를들면, A와 B가 계약한 문서를 IPFS에 업로드 한 후, C가 해당 해시값을 알아내어 다운로드한 후 계약 내용을 볼 수 있습니다.
여기서 해결할 수 있는 방법은 파일을 암호화 하여 받는사람이 쉽게 볼 수 없도록 하는겁니다. 그러나 암호화를 아무렇게나 하면 계약의 당사자인 A와 B도 파일을 볼 수 없게 됩니다. 여기서 RSA 공개키 암호화 방식을 이용하면 A와 B만 파일열람 가능하도록 암호화 할 수 있습니다.

RSA의 알고리즘보다 RSA를 어떤식으로 적용하는지를 중점적으로 알아보겠습니다.

· RSA(공개키 암호화)

RSA는 키쌍을 통해서 암호화-복호화 하는 방식을 의미합니다. 여기서 키쌍이란 개인키(private key)공개키(public key)를 의미합니다. 만약 message를 private key로 암호화 하면 public key로 복호화가 가능하고, public key로 암호화 했다면 private key로 복호화가 가능합니다. 일반적으로 메시지를 받는 사람의 public key를 가져와서 암호화 한 후, 전달을 하게 됩니다. 메시지를 전달받으면 본인의 private key로 복호화를 하는것인 RSA 방식입니다.

좀 더 쉽게 예를 들어보겠습니다. A라는 사람이 B라는 사람에게 message를 전송한다고 예를 들어보겠습니다. A와 B는 각자 키쌍을 가지고 있습니다. A는 본인만의 private key, public key를 가지고 있고, B도 private key, public key를 가지고 있게 됩니다. A는 B에게 public key를 요청합니다. B의 public key를 받은 A는 B의 public key를 이용하여 message를 암호화한 후 B에게 전송합니다. message를 전송받은 B는 본인의 private key를 이용하여 복호화를 하게됩니다. 만약에 전송중 C가 파일을 가로챘더라도 B의 private key를 알 수 없기 때문에 message의 내용을 알 수 없게 됩니다.

여기서 중요한건 공개키(public key)는 외부에 노출이 되어야 하나, 개인키(private key)는 외부에 노출이 되면 안됩니다.

RSA는 암호화 알고리즘으로 구현되었지만 우리는 GPG라는 툴을 이용하면 수학적인 알고리즘을 몰라도 사용할 수 있습니다.

GPG

GPG를 사용하기 위해서 설치를 해야합니다.
GPG는 GNU Private Guard의 약자입니다. gnupg를 설치하면 gpg를 사용할 수 있습니다.

 

설치하기

· ubuntu

$ sudo apt-get update
$ suod apt-get install gnupg

· MAC OsX

$ brew install gnupg
사용하기

사용하기 전에 --help를 이용하여 명령어들을 확인해줍니다.

$ gpg --help 

gpg (GnuPG) 2.2.9
libgcrypt 1.8.3
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /Users/bagjeongtae/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

Syntax: gpg [options] [files]
Sign, check, encrypt or decrypt
Default operation depends on the input data

Commands:
 
 -s, --sign                  make a signature
     --clear-sign            make a clear text signature
 -b, --detach-sign           make a detached signature
 -e, --encrypt               encrypt data
 -c, --symmetric             encryption only with symmetric cipher
 -d, --decrypt               decrypt data (default)
     --verify                verify a signature
 -k, --list-keys             list keys
     --list-signatures       list keys and signatures
     --check-signatures      list and check key signatures
     --fingerprint           list keys and fingerprints
 -K, --list-secret-keys      list secret keys
     --generate-key          generate a new key pair
     --quick-generate-key    quickly generate a new key pair
     --quick-add-uid         quickly add a new user-id
     --quick-revoke-uid      quickly revoke a user-id
     --quick-set-expire      quickly set a new expiration date
     --full-generate-key     full featured key pair generation
     --generate-revocation   generate a revocation certificate
     --delete-keys           remove keys from the public keyring
     --delete-secret-keys    remove keys from the secret keyring
     --quick-sign-key        quickly sign a key
     --quick-lsign-key       quickly sign a key locally
     --sign-key              sign a key
     --lsign-key             sign a key locally
     --edit-key              sign or edit a key
     --change-passphrase     change a passphrase
     --export                export keys
     --send-keys             export keys to a keyserver
     --receive-keys          import keys from a keyserver
     --search-keys           search for keys on a keyserver
     --refresh-keys          update all keys from a keyserver
     --import                import/merge keys
     --card-status           print the card status
     --edit-card             change data on a card
     --change-pin            change a card's PIN
     --update-trustdb        update the trust database
     --print-md              print message digests
     --server                run in server mode
     --tofu-policy VALUE     set the TOFU policy for a key

Options:
 
 -a, --armor                 create ascii armored output
 -r, --recipient USER-ID     encrypt for USER-ID
 -u, --local-user USER-ID    use USER-ID to sign or decrypt
 -z N                        set compress level to N (0 disables)
     --textmode              use canonical text mode
 -o, --output FILE           write output to FILE
 -v, --verbose               verbose
 -n, --dry-run               do not make any changes
 -i, --interactive           prompt before overwriting
     --openpgp               use strict OpenPGP behavior

(See the man page for a complete listing of all commands and options)

Examples:

 -se -r Bob [file]          sign and encrypt for user Bob
 --clear-sign [file]        make a clear text signature
 --detach-sign [file]       make a detached signature
 --list-keys [names]        show keys
 --fingerprint [names]      show fingerprints

Please report bugs to <https://bugs.gnupg.org>.

· 키쌍(공개키 - 개인키) 만들기

$ gpg --gen-key
gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name: test123
Email address: pjt3591oo@naver.com
You selected this USER-ID:
    "test123 <pjt3591oo@naver.com>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit?

--gen-key를 이용하여 키쌍을 생성할 수 있습니다. 키쌍을 생성할 땐 이름과 이메일을 입력한 후 o를 눌러주면 비밀번호를 입력하라고 뜹니다.

$ gpg --gen-key
gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name: test123
Email address: pjt3591oo@naver.com
You selected this USER-ID:
    "test123 <pjt3591oo@naver.com>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? o
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key 19A21C8C1CCA7FE6 marked as ultimately trusted
gpg: revocation certificate stored as '/root/.gnupg/openpgp-revocs.d/FCFA2C0760EFD0569C50E8BE19A21C8C1CCA7FE6.rev'
public and secret key created and signed.

pub   rsa3072 2018-08-19 [SC] [expires: 2020-08-18]
      FCFA2C0760EFD0569C50E8BE19A21C8C1CCA7FE6
uid                      test123 <pjt3591oo@naver.com>
sub   rsa3072 2018-08-19 [E] [expires: 2020-08-18]

정상적으로 생성되면 앞의 결과처럼 출력됩니다.

키쌍은 ~/.gnupg에 저장되게 됩니다.

 
$ cd ~/.gnupg
$ ls 
S.gpg-agent          S.gpg-agent.extra  openpgp-revocs.d   pubring.kbx   random_seed
S.gpg-agent.browser  S.gpg-agent.ssh    private-keys-v1.d  pubring.kbx~  trustdb.gpg

여기서 공개키(public key)는 openpgp-revocs.d에 저장되고 개인키(private-keys-v1.d)에 저장됩니다.

· 키 확인

이렇게 생성된 키들은 디렉터리를 들어가도 되지만 명령어로 확인 가능합니다.

$ gpg -k
/root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2018-08-18 [SC] [expires: 2020-08-17]
      9A5A17D7EC1C149A9560B3048AEB7E44EC40006F
uid           [ultimate] parkjeongtae <pjt3591oo@naver.com>
sub   rsa3072 2018-08-18 [E] [expires: 2020-08-17]

pub   rsa3072 2018-08-19 [SC] [expires: 2020-08-18]
      FCFA2C0760EFD0569C50E8BE19A21C8C1CCA7FE6
uid           [ultimate] test123 <pjt3591oo@naver.com>
sub   rsa3072 2018-08-19 [E] [expires: 2020-08-18]
$ gpg --list-keys
/root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2018-08-18 [SC] [expires: 2020-08-17]
      9A5A17D7EC1C149A9560B3048AEB7E44EC40006F
uid           [ultimate] parkjeongtae <pjt3591oo@naver.com>
sub   rsa3072 2018-08-18 [E] [expires: 2020-08-17]

pub   rsa3072 2018-08-19 [SC] [expires: 2020-08-18]
      FCFA2C0760EFD0569C50E8BE19A21C8C1CCA7FE6
uid           [ultimate] test123 <pjt3591oo@naver.com>
sub   rsa3072 2018-08-19 [E] [expires: 2020-08-18]

저는 2개의 키가 보관되어 있습니다. 두 번생성 했기 때문에 그렇습니다. 
-k나 --list-keys 둘 중 하나로 확인가능 합니다.

· 공개키를 이용하여 암호화 하기

$ echo "testtest" > test.txt # 암호화할 파일 생성
$ gpg --output "test.rsa.txt" --encrypt --recipient "parkjeongtae" "test.txt"

--output : 암호화된 파일 명.
--encrypt: 암호화 한다는 의미.
--recipient: 누구의 공개키로 암호화 할지(받는 사람), 해당 파일을 받은 사람은 개인키로 복호화 하여 파일열람 가능.
마지막에는 어떤 파일을 암호화 할지 들어갑니다.

$ ls
test.rsa.txt  test.txt
$ cat test.rsa.txt
??????
      ?pu???9?j'??`?ޚ???a????
%??/4??ǿ?v;5?\)?a?????????Mj?</½uZ?5E?<)??????d???
                                         ?Mdi???Q?q??ᓃ~Gr?v{F?p0s ??ZF?s?!?ׁ?????y??L?0??'?dP?T$?<?L?k~??D%?Xzx?Ɉ}<5?B??w?||??*?4nL??g*???Ӎ
                                                                                                                                         ??D?3[y??얖???
             ?n??_?????=s?WE?w?s*???ݘ!???0?O?ʦ??
A? [??(n??M?^??T??9q/??3????
                            ?4C(a6???˔
W???m?E?Ky?GX[?N;?-8“?)?g?\D???????Dh?.??.?v?H?a???k??+?C??N?Z??^???

보기가 매우 불편합니다. --armor 옵션을 추가하여 좀더 보기 좋게 만들어 보겠습니다.

$ gpg --armor --output "test.rsa.txt" --encrypt --recipient "parkjeongtae" "test.txt"
$ cat test.rsa.txt
-----BEGIN PGP MESSAGE-----

hQGMAw4C0hWc9OC7AQv/R4oQ6e81xem2flDnVnIwl2JvetvDGUkbZPDsxmB/i/0o
fxJcyH/Vd3CO3w1cMzTDCdo8eWwrpho7oaRn9iBzWckOTJXvheegIDuJYcGvqEzy
zfDXcSvtBLxO6Bqa8Sv7aPGm1DLUjOjSrHUr7cfr8cagWQHZcnr//OmS6mA9JKQ1
FJNa7DH876qUBvkVFugZkSHSEemLbHGyUaZY9XUUOLZsLTDHuOJlfICEW26ugSRC
dsA1++8qbA4eslgyKDJsXGuU5irrAruHkBSGMNSrGaUFMGeDPA5YVvPK6CLPTF3g
9Ma08LpysVIvkSbdttHJ6BcchK+Cy288t0QV4BgJMkqp677niBMuEirw7w4TuoNn
fPwCVfI2SEcqepS24HBprS7va0oQbHwJynQbRJMklMYXkp32gTiKiHqA0fXIDAoa
YiRtZrO3JRN3QVsZyLHCkOWq4MqtoP/GfHYdng5i7CT1W+0L1/4rm/LPWyEyIauq
s7zj7bZkatf3ZTpJva/y0kcBDsPI4T5VwgrFYzFbg9vQQQ6XMb8uqUyvTxLa2mlm
OLgbiPSClG3jjaiH7p/M0Ct7+gLWXBDodoU0QvMG/kiL80brkE1/OQ==
=Hhmt
-----END PGP MESSAGE-----

여기서 recipient에 들어가는 건 -k, --list-keys 했을 때 uid부분을 의미합니다. 또한 받는 사람이 여러명이라면 다음과 같이 작성할 수 있습니다

$ gpg --output "test.rsa.txt" --encrypt --recipient "parkjeongtae1" --recipient "parkjeongtae2" "test.txt"

이렇게 만들어진 파일은 parkjeongtae1 또는 parkjeongtae2의 개인키로 복호화가 가능합니다. 즉, 리스팅을 해놓는다면 리스팅 된 유저중 한명의 개인키로 복호화가 가능합니다.

해당 테스트는 로컬에서 진행중이기 때문에 개인키와 공개키가 다 등록되어 있지만 다른 사람의 공개키가 필요하다면 실제 파일을 받아와서 공개키를 등록해야 합니다. 

먼저, 복호화 하는 방법을 알아보고 공개키를 전달하는 방법과 전달받은 공개키를 등록하는 방법에 대해서 알아보겠습니다.

· 복호화

$ gpg --output "de_test.txt" --decrypt "test.rsa.txt"

--output: 복호화한 후 파일명
--decrypt: 복호화 한다는 의미
마지막에는 암호화 할 파일을 넣어줍니다.

복호화하게 되면 개인키를 이용하여 복호화 합니다. 개인키를 만들때 비밀번호를 이용하여 해독해줍니다.

$ gpg --output "de_test.txt" --decrypt "test.rsa.txt"
gpg: encrypted with 3072-bit RSA key, ID 0E02D2159CF4E0BB, created 2018-08-18
      "parkjeongtae <pjt3591oo@naver.com>"

$ ls
de_test.txt  test.rsa.txt  test.txt

$ cat de_test.txt
testtesttest

파일이 복호화가 잘 되었습니다.

· 공개키 가져오기

외부에 공개키를 보내기 위해 공개키를 가져오겠습니다. 공개키를 가져올 땐 --export를 이용합니다.

$ gpg --armor --output "pub.parkjeongtae.rsa" --export "parkjeongtae"

$ ls
pub.parkjeongtae.rsa

$ cat pub.parkjeongtae.rsa
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
003a217i2vEOyG7jsC0oN4TOsIZ8/U7KDwU=
=PKra
-----END PGP PUBLIC KEY BLOCK-----

외부에 전달할 공개키 파일을 만들어 줍니다.

해당 파일을 다른 유저에게 전달해줍니다.

 
$ gpg -k
/Users/bagjeongtae/.gnupg/pubring.kbx
-------------------------------------
pub   rsa2048 2018-08-17 [SC] [expires: 2020-08-16]
      779F88055784C0CE97D6427CC3E78B2D96523EA1
uid           [ultimate] macgenkey.asc <pjt3591oo@naver.com>
sub   rsa2048 2018-08-17 [E] [expires: 2020-08-16]

pub   rsa2048 2018-08-19 [SC] [expires: 2020-08-18]
      2CCAF94A4A385146658849E75D396B98CFDF7B32
uid           [ultimate] mungae <pjt3591oo@naver.com>
sub   rsa2048 2018-08-19 [E] [expires: 2020-08-18]

앞에서 공개키를 생성한 시스템은 ubuntu이고 해당 시스템은 mac 입니다. ubuntu에서 생성한 공개키를 mac 시스템에게 전달해보겠습니다.

$ ls
pub.parkjeongtae.rsa

MAC 시스템에 전달하였습니다.

· 전달받은 공개키 등록

$ gpg -k
/Users/bagjeongtae/.gnupg/pubring.kbx
-------------------------------------
pub   rsa2048 2018-08-17 [SC] [expires: 2020-08-16]
      779F88055784C0CE97D6427CC3E78B2D96523EA1
uid           [ultimate] macgenkey.asc <pjt3591oo@naver.com>
sub   rsa2048 2018-08-17 [E] [expires: 2020-08-16]

pub   rsa2048 2018-08-19 [SC] [expires: 2020-08-18]
      2CCAF94A4A385146658849E75D396B98CFDF7B32
uid           [ultimate] mungae <pjt3591oo@naver.com>
sub   rsa2048 2018-08-19 [E] [expires: 2020-08-18]

전달은 후 등록하기 전 키 리스트

$ gpg --import "pub.parkjeongtae.rsa" 
gpg: key 8AEB7E44EC40006F: public key "parkjeongtae <pjt3591oo@naver.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1

$ $ gpg -k
/Users/bagjeongtae/.gnupg/pubring.kbx
-------------------------------------
pub   rsa2048 2018-08-17 [SC] [expires: 2020-08-16]
      779F88055784C0CE97D6427CC3E78B2D96523EA1
uid           [ultimate] macgenkey.asc <pjt3591oo@naver.com>
sub   rsa2048 2018-08-17 [E] [expires: 2020-08-16]

pub   rsa2048 2018-08-19 [SC] [expires: 2020-08-18]
      2CCAF94A4A385146658849E75D396B98CFDF7B32
uid           [ultimate] mungae <pjt3591oo@naver.com>
sub   rsa2048 2018-08-19 [E] [expires: 2020-08-18]

pub   rsa3072 2018-08-18 [SC] [expires: 2020-08-17]
      9A5A17D7EC1C149A9560B3048AEB7E44EC40006F
uid           [ unknown] parkjeongtae <pjt3591oo@naver.com>
sub   rsa3072 2018-08-18 [E] [expires: 2020-08-17]

잘 등록되었습니다.

uid에 unknown이 뜨는이유는 해당 공개키 신뢰도가 없기 때문입니다. 이제 신뢰도를 결정짓는 작업을 해보도록 하겠습니다.

신뢰도를 결정짓는 작업은 수작업으로 이루어지게 됩니다
1. 직접 확인(전화나, 메일등의 방법)
2. Web of Trust : 대체자를 통해 확인

둘 중 하나의 과정을 거쳐 공개키를 받은 유저의 개인키를 통해 서명을 하게됩니다.

· 공개키 서명

먼저 --fingerprint "uid" 통해 공개키의 지문을 확인합니다.

$ gpg --fingerprint "parkjeongtae"
pub   rsa3072 2018-08-18 [SC] [expires: 2020-08-17]
      9A5A 17D7 EC1C 149A 9560  B304 8AEB 7E44 EC40 006F
uid           [ unknown] parkjeongtae <pjt3591oo@naver.com>
sub   rsa3072 2018-08-18 [E] [expires: 2020-08-17]

키 서명을 위해 --edit-key "uid"를 이용합니다.

 
$ gpg --edit-key "parkjeongtae"
gpg (GnuPG) 2.2.9; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub  rsa3072/8AEB7E44EC40006F
     created: 2018-08-18  expires: 2020-08-17  usage: SC  
     trust: unknown       validity: unknown
sub  rsa3072/0E02D2159CF4E0BB
     created: 2018-08-18  expires: 2020-08-17  usage: E   
[ unknown] (1). parkjeongtae <pjt3591oo@naver.com>

gpg>

--edit-key를 이용하면 gpg 명령어 창으로 들어가게 됩니다.

 
gpg> help
quit        quit this menu
save        save and quit
help        show this help
fpr         show key fingerprint
grip        show the keygrip
list        list key and user IDs
uid         select user ID N
key         select subkey N
check       check signatures
sign        sign selected user IDs [* see below for related commands]
lsign       sign selected user IDs locally
tsign       sign selected user IDs with a trust signature
nrsign      sign selected user IDs with a non-revocable signature
deluid      delete selected user IDs
delkey      delete selected subkeys
delsig      delete signatures from the selected user IDs
pref        list preferences (expert)
showpref    list preferences (verbose)
trust       change the ownertrust
revsig      revoke signatures on the selected user IDs
enable      enable key
disable     disable key
showphoto   show selected photo IDs
clean       compact unusable user IDs and remove unusable signatures from key
minimize    compact unusable user IDs and remove all signatures from key

* The 'sign' command may be prefixed with an 'l' for local signatures (lsign),
  a 't' for trust signatures (tsign), an 'nr' for non-revocable signatures
  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).

help를 통해 어떤 명령어를 사용할 수 있는지 알 수 있습니다.

gpg>  lsign
          
pub  rsa3072/8AEB7E44EC40006F
     created: 2018-08-18  expires: 2020-08-17  usage: SC  
     trust: unknown       validity: unknown
 Primary key fingerprint: 9A5A 17D7 EC1C 149A 9560  B304 8AEB 7E44 EC40 006F

     parkjeongtae <pjt3591oo@naver.com>

This key is due to expire on 2020-08-17.
Are you sure that you want to sign this key with your
key "macgenkey.asc <pjt3591oo@naver.com>" (C3E78B2D96523EA1)

The signature will be marked as non-exportable.

Really sign? (y/N)

lsign을 통해 서명을 해줍니다. 정말로 사인을 할 지 묻는다면 y를 눌러줍니다.

uid를 보면 MAC 로컬에 있는 키를 이용하여 서명하기 때문에 본인 키의 비밀번호를 입력해 줍니다.

gpg> check 
uid parkjeongtae <pjt3591@naver.com> 
sig!3 9A5A17D7 2018-08-19  [self-signature] 
sig! 779F8805 2018-08-19 Infinite Cookies <pjt3591oo@naver.com>>

정상적으로 서명이 됬다면 check했을 때 표시가 됩니다.(근데 전 아무것도 안뜨네요 ㅋㅋㅋ) 안뜨더라도 그냥 무시하고 다음으로 진행했습니다.

> save

save를 통해 저장하고 나갑니다.

$ gpg -k
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   1  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: depth: 1  valid:   1  signed:   0  trust: 1-, 0q, 0n, 0m, 0f, 0u
gpg: next trustdb check due at 2020-08-16
/Users/bagjeongtae/.gnupg/pubring.kbx
-------------------------------------
pub   rsa2048 2018-08-17 [SC] [expires: 2020-08-16]
      779F88055784C0CE97D6427CC3E78B2D96523EA1
uid           [ultimate] macgenkey.asc <pjt3591oo@naver.com>
sub   rsa2048 2018-08-17 [E] [expires: 2020-08-16]

pub   rsa2048 2018-08-19 [SC] [expires: 2020-08-18]
      2CCAF94A4A385146658849E75D396B98CFDF7B32
uid           [ultimate] mungae <pjt3591oo@naver.com>
sub   rsa2048 2018-08-19 [E] [expires: 2020-08-18]

pub   rsa3072 2018-08-18 [SC] [expires: 2020-08-17]
      9A5A17D7EC1C149A9560B3048AEB7E44EC40006F
uid           [  full  ] parkjeongtae <pjt3591oo@naver.com>
sub   rsa3072 2018-08-18 [E] [expires: 2020-08-17]

문서쪽에서는 self-signature이 뜨는데 저는 full이 뜨네요 이 부분은 좀더 확인을 해봐야 겠네요.

시나리오 테스트 해보기

● 시스템 소개

· 시스템 1

OS : MAC(HOST)

· 시스템2

OS : Ubuntu 16.04(Docker)

● 스템간 키쌍

· 시스템 1

$ gpg -k
/Users/bagjeongtae/.gnupg/pubring.kbx
-------------------------------------
pub   rsa2048 2018-08-17 [SC] [expires: 2020-08-16]
      779F88055784C0CE97D6427CC3E78B2D96523EA1
uid           [ultimate] macgenkey.asc <pjt3591oo@naver.com>
sub   rsa2048 2018-08-17 [E] [expires: 2020-08-16]

pub   rsa2048 2018-08-19 [SC] [expires: 2020-08-18]
      2CCAF94A4A385146658849E75D396B98CFDF7B32
uid           [ultimate] mungae <pjt3591oo@naver.com>
sub   rsa2048 2018-08-19 [E] [expires: 2020-08-18]

pub   rsa3072 2018-08-18 [SC] [expires: 2020-08-17]
      9A5A17D7EC1C149A9560B3048AEB7E44EC40006F
uid           [  full  ] parkjeongtae <pjt3591oo@naver.com>
sub   rsa3072 2018-08-18 [E] [expires: 2020-08-17]

· 시스템 2

 
$ gpg -k
/root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2018-08-18 [SC] [expires: 2020-08-17]
      9A5A17D7EC1C149A9560B3048AEB7E44EC40006F
uid           [ultimate] parkjeongtae <pjt3591oo@naver.com>
sub   rsa3072 2018-08-18 [E] [expires: 2020-08-17]

pub   rsa3072 2018-08-19 [SC] [expires: 2020-08-18]
      FCFA2C0760EFD0569C50E8BE19A21C8C1CCA7FE6
uid           [ultimate] test123 <pjt3591oo@naver.com>
sub   rsa3072 2018-08-19 [E] [expires: 2020-08-18]

pub   rsa2048 2018-08-17 [SC] [expires: 2020-08-16]
      779F88055784C0CE97D6427CC3E78B2D96523EA1
uid           [  full  ] macgenkey.asc <pjt3591oo@naver.com>
sub   rsa2048 2018-08-17 [E] [expires: 2020-08-16]

키가 3개씩 등록되있습니다.

시스템1과 시스템2의 3번째 개인키는 서로의 개인키를 sign하여 가지고 있는것 입니다.

 

● 시나리오

시스템2: 파일 생성
시스템2: 시스템1의 개인키를 이용하여 파일 암호화
시스템2: 시스템1에게 파일 전달
시스템1: 시스템1의 개인키를 이용하여 복호화

1. 시스템2에서 파일생성

$ echo "hello world" > hello.world
$ cat hello.world
hello world
$ls 
hello.world

2. 시스템2에서 시스템 1의 공개키를 이용하여 암호화

$ gpg --armor --output "en.hello.world" --encrypt --recipient "macgenkey.asc" "hello.world"
$ ls 
en.hello.world  hello.world
$ cat en.hello.world
-----BEGIN PGP MESSAGE-----

hQEMA0oAZMg2BYKoAQgAzGriTDRSamfi4rdc3zOmQZfQCs905KshFO2eRIF20bqO
2Y1Zr56IwBB6QSkK/cAjEH4+F4dtH6sG+4ir6KENWZrHlqWUZLJQ63UG4RakjiVV
inVaDp7PeegRG5F50z2rtjkFNjK7hO/IUIFVs1omj2fsC8r3fvT/NaZdCBk8gTh+
5GdLD7RY1hf95iIn2UvYE++YXwaqShD18ptE47scPb2CejS4A+lonKy03eLJcLeZ
GZut7QchDCIAdxxigCRpuRgBbpBdu68ZS1qNHlDACD/SOP5rb8WFpdMAOK7Fv/eP
N3JwkNRjJj0BSmHKWn4eyFnfGB2HyzEAR1K8yplI/dJMAVxCbXc5/D+PUKQNWETf
2v87DSmVy15c/Ll2L0xblA/8TuSB1gmDfAa5Ah7GY5KufIYlVBJjt8NfzadqhXz2
SekpmUrw5AKYJt3UoA==
=Rsyn
-----END PGP MESSAGE-----

3. 시스템2 -> 시스템1 암호화된 파일전달

 
$ docker cp ubuntu.test.1:/home/test/en.hello.world $PWD # 호스트에서 명령어 수행(컨테이너 -> 호스트 파일 복사) 
$ ls
en.hello.world
$ cat en.hello.world
-----BEGIN PGP MESSAGE-----

hQEMA0oAZMg2BYKoAQgAzGriTDRSamfi4rdc3zOmQZfQCs905KshFO2eRIF20bqO
2Y1Zr56IwBB6QSkK/cAjEH4+F4dtH6sG+4ir6KENWZrHlqWUZLJQ63UG4RakjiVV
inVaDp7PeegRG5F50z2rtjkFNjK7hO/IUIFVs1omj2fsC8r3fvT/NaZdCBk8gTh+
5GdLD7RY1hf95iIn2UvYE++YXwaqShD18ptE47scPb2CejS4A+lonKy03eLJcLeZ
GZut7QchDCIAdxxigCRpuRgBbpBdu68ZS1qNHlDACD/SOP5rb8WFpdMAOK7Fv/eP
N3JwkNRjJj0BSmHKWn4eyFnfGB2HyzEAR1K8yplI/dJMAVxCbXc5/D+PUKQNWETf
2v87DSmVy15c/Ll2L0xblA/8TuSB1gmDfAa5Ah7GY5KufIYlVBJjt8NfzadqhXz2
SekpmUrw5AKYJt3UoA==
=Rsyn
-----END PGP MESSAGE-----​

· 시스템1에서 개인키를 이용하여 복호화

$ gpg --output "de.hellp.world" --decrypt "en.hello.world"

비밀번호 입력

$ ls 
de.hellp.world	en.hello.world
$ cat de.hellp.world
hello world
정상적으로 복호화 완료
Comments