[실습] gpg CMD 이용한 파일 암호화/복호화(AES 256)
gpg 명령어를 이용한 파일 암호화/복호화(AES 256 알고리즘 사용)
사용 시스템
kali
PGP versus GPG(GNU PG)
PGP
- Symantec PGP(상용): http://www.symantec.com/encryption
- 1991년 필 지머먼(Phil Zimmermann)이라는 프로그래머가 개발한 전자우편 암호화 프로그램과 그 파생작들을 말한다. 이메일 내용 자체를 암호화하여 오로지 보내는 사람과 받는 사람만이 그 원문(Plain Text)을 알 수 있도록 하는 암호화 방식을 말한다.
GPG(GNU PG)
- GnuPG(오픈소스) : https://www.gnupg.org
- GPG가 처음 개발되었을 때는 무료였지만, 현재는 유료로 시만텍(Symantec)에서 판매하고 있다. 그러나 PGP의 한 갈래인 OpenPGP는 현재 인터넷 표준으로 자리매김 하였으며, 이를 이용한 GnuPG같은 여러 프로그램이 등장했다. 당연하게 윈도우나 맥, 리눅스 버전도 존재한다.
gpg CMD 개요
(ㄱ) OpenPGP 암복호화
(ㄴ) 서명(signing) 명령어
① gpg 사용법 확인
(암호화)
# gpg -c file1 /* -c : crypt */
(확 인)
# gpg -d file1.gpg /* -d : decrypt */
(복호화)
# gpg file1.gpg
# apt-get -y install gpg
# which gpg
/usr/bin/gpg |
② 실습 준비
# cd /test && rm -rf /test/*
# cp /etc/hosts file1.txt
# ls
file1.txt |
③ gpg CMD 이용한 암호화
# gpg -c file1.txt
gpg: keybox '/root/.gnupg/pubring.kbx' created |
-> 암호: soldesk1.
# ls
file1.txt file1.txt.gpg |
별도의 파일 file1.txt.gpg 파일이 생성된다.
# file *
file1.txt: ASCII text file1.txt.gpg: GPG symmetrically encrypted data (AES256 cipher) |
④ gpg CMD 이용한 복호화
# rm -f file1.txt
복원할 파일이므로 file1.txt 파일을 미리 삭제해 놓는다.
# gpg -d file1.txt.gpg
gpg: AES256.CFB encrypted data gpg: encrypted with 1 passphrase 127.0.0.1 localhost 127.0.1.1 kali.example.com kali # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters |
decryption 되지만 파일이 만들어 지지는 않는다.
대신 모니터에 복호화된 내용을 출력한다.
복호화된 내용을 stdout 출력한다는 것을 알수 있다.
# ls
file1.txt.gpg |
# gpg file1.txt.gpg
gpg: WARNING: no command supplied. Trying to guess what you mean ... gpg: AES256 encrypted data gpg: encrypted with 1 passphrase |
# ls
file1.txt file1.txt.gpg |
# cat file1.txt
127.0.0.1 localhost 127.0.1.1 kali # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters |
[추가적인 실습]
현재 시스템을 재부팅 하지 않은 상태에서 user01 사용자로 file1.txt.gpg 파일 내용 보기
# ssh user01@localhost
$ cd /test
$ gpg -d file1.txt.gpg
$ gpg -d file1.txt.gpg
$ exit
reboot 후에 다시 시도하기
# reboot
재부팅 이후에 root 사용자로 로그인
# cd /test
# gpg -d file1.txt.gpg
# gpg -d file1.txt.gpg
[실습] 사전 파일을 이용한 공격 프로그램 제작
사용시스템
kali
① 준비 작업
# rm -f /test/file1.txt
② user01 사용자 로그인
# ssh -X user01@localhost
③ 사전 파일 확인
$ cat /python/dict/dict.txt
user01 user02 admin administrator soldesk1. kkkk abc |
$ crunch 4 4 'abcd' > dict2.txt
$ mv dict.txt dict3.txt
$ cat dict2.txt dict3.txt > dict.txt
$ cat dict.txt
aaaa aaab aaac aaad aaba aabb aabc aabd .......(중략)........ user01 user02 admin administrator soldesk1. kkkk abc |
④ 공격 프로그램 제작(Bash shell script)
$ cd /python
$ vi attack_gpg.sh
attack_gpg.sh
#!/bin/bash
DictFile=/python/dict/dict.txt
EncFile=/test/file1.txt.gpg
for i in $(cat $DictFile)
do
gpg -d --batch --passphrase $i $EncFile >/dev/null 2>&1
if [ $? -eq 0 ] ; then
echo "[ OK ] Key found. ==> $i"
break
else
echo "[ FAIL ] Key not found. ==> $i"
fi
sleep 1
done
$ chmod 755 attack_gpg.sh
$ ./attack_gpg.sh
[ FAIL ] Key not found. ==> aaaa [ FAIL ] Key not found. ==> aaab [ FAIL ] Key not found. ==> aaac [ FAIL ] Key not found. ==> aaad .... (중략) ..... [ FAIL ] Key not found. ==> user01 [ FAIL ] Key not found. ==> user02 [ FAIL ] Key not found. ==> admin [ FAIL ] Key not found. ==> administrator [ OK ] Key found. ==> soldesk |
attack_gpg2.sh - 기능을 조금 더 확장한 프로그램
#!/bin/bash
DictFile=/python/dict/dict.txt
EncFile=/test/file1.txt.gpg
crack() {
echo
echo "====== Decrypted File Contents ======"
gpg -d --batch --passphrase $i $EncFile
}
for i in $(cat $DictFile)
do
gpg -d --batch --passphrase $i $EncFile >/dev/null 2>&1
if [ $? -eq 0 ] ; then
echo "[ OK ] Key found. ==> $i"
crack
break
else
echo "[ FAIL ] Key not found. ==> $i"
fi
sleep 1
done
⑤ 공격 프로그램 제작(python script)
attack_gpg.sh 기능이 같은 프로그램을 python으로 제작해 보자.
attack_gpg.py
###!/usr/bin/python3
import os
def main():
dictfile = '/python/dict/dict.txt'
encfile = '/test/file1.txt.gpg'
fd = open(dictfile)
for word in fd.readlines():
word = word.rstrip()
# CMD => gpg -d --batch --passphrase word encfile > /dev/null 2>&1
cmd = 'gpg -d --batch --passphrase %s %s > /dev/null 2>&1' % (word,encfile)
ret = os.system(cmd)
if ret == 0:
print('[ OK ]', word)
break
else:
print('[ FAIL ]', word)
if __name__ == '__main__':
main()
$ chmod 755 *.py
$ ./attack_gpg.py
[ FAIL ] aaaa [ FAIL ] aaab [ FAIL ] aaac [ FAIL ] aaad [ FAIL ] aaba .... 중략 ..... [ FAIL ] dddd [ FAIL ] user01 [ FAIL ] user02 [ FAIL ] admin [ OK ] soldesk1. Process finished with exit code 0 |
(정리) ccrypt CMD, gpg CMD
ccrypt CMD
(암호화) # ccrypt file1.txt
(확 인) # ccrypt -c file1.txt.cpt
(복호화) # ccrypt -d file1.txt.cpt
gpg CMD
(암호화) # gpg -c file1.txt
(확 인) # gpg -d file1.txt.gpg
(복호화) # gpg file1.txt.gpg
ccrypt CMD, gpg CMD 활용
LOG 파일 백업시 암호화
report.txt 결과 파일 암호화
기타
'현대 암호학' 카테고리의 다른 글
[현대 암호학] 05 -2. ECB 모드 (0) | 2021.06.23 |
---|---|
[현대 암호학] 05. 블록 암호 모드 (0) | 2021.06.23 |
[현대 암호학] 04. 실습(1) (0) | 2021.06.23 |
[현대 암호학] 04-6. AES - Rijindael (0) | 2021.06.22 |
[현대 암호학] 04-5. AES 선정 과정 (0) | 2021.06.22 |