[실습] nc CMD 사용한 DES 암복호화 서버/클라이언트 만들기
사용시스템
칼리리눅스(KaliLinux)
작업 시나리오
칼리리눅스에서 두개의 터미널을 띄워서 하는 하나는 서버(serverDES.py), 다른 하나는 클라이언트(clientDES.py)로 사용한다.
개발은 양쪽 터미널에서 작업한다.
(사전 테스트) nc CMD 사용법
[TERM1] # nc -l -p 7979
[TERM2] # nc 127.0.0.1 7979
ls
date
<CTRL + C>
[TERM1] # nc -l -p 7979 > file.out
[TERM2] # nc 127.0.0.1 7979 < /etc/hosts
<CTRL + C>
[TERM1] # nc -l -p 7979 > file.out
[TERM2] # nc -q 1 127.0.0.1 7979 < /etc/hosts
① 서버 실행
serverDES.py
#!/usr/bin/python3
import os
cmd = 'nc -lp 7979'
os.system(cmd)
② 클라이언트 실행
clientDES.py
#!/usr/bin/python3
import os
cmd = 'nc localhost 7979'
os.system(cmd)
③ 서버 수정 후 재 실행
serverDES.py
#!/usr/bin/python3
import os
cmd = 'nc -lp 7979 > file.out'
os.system(cmd)
④ 클라이언트 수정 후 재 실행
clientDES.py
#!/usr/bin/python3
import os
cmd = 'nc -q 2 localhost 7979 < file.in'
os.system(cmd)
# cp /etc/hosts file.in
⑤ 생성된 파일 확인
[TERM]
# cat file.out
# diff file.in file.out
[참고] 가상 환경 만들기(python module path 등록)
- 쉘(shell) prompt에서 python을 개발할 때 자신이 개발한 모듈을 다른 파일에서 import가 되지 않는 경우가 많이 발생한다.
- 문제의 원인은 python module path에 등록이 되지 않은 디렉토리의 모듈을 import 해서 생긴다.
- 이 문제를 해결하기 위해서는 현재 작업하는 디렉토리를 python module path로 등록하는 것이다.
(1) PYTHONPATH 등록하여 문제 해결하기 export PYTHONPATH=$PYTHONPATH:/python ($HOME/.bashrc) (2) PyCharm에서 새로운 project(가상 환경) 생성하여 해결하기 PyCharm에서 새로운 Project를 생성하고 Project 디렉토리로 /python/pkg 지정하고 프로그램을 개발해도 된다. (ㄱ) PyCharm에서 새로운 프로젝트 추가 Pycharm에서 새로운 Project 추가 * File > New Project > Location : /python Project Interpreter: New Virtualenv environment Location : /python/venv Base interpreter : Python 3 create (ㄴ) 가상 환경 활성화 # cd /python/pkg # source venv/bin/activate # deactivate (주의) 가상환경에서는 프로젝트 마다 별도의 환경이기 때문에 PyCryptodome 설치해야 한다. |
clientDES.py, serverDES.py 파일 예
(준비 사항)
- DES3FromFile.py 파일 준비
- plain.txt 파일
(주의) serverDES.py 실행하고 clientDES.py 실행해야 한다.
⑥ clientDES.py 개발
clientDES.py
###!/usr/bin/python3
import os
import sys
try:
import DES3FromFile
except Exception as e:
print('Error:', e)
sys.exit(1)
def main():
# Cliect : pfile(ptext) -> E(pfile) -> cfile(ctext) -> nc CMD ->
# Server : nc CMD -> cfile(ctext) -> D(ctext) -> pfile(ptext)
pfile = 'plain'
cfile2 = 'plain.enc2'
cipher = DES3FromFile.MyDES3_CBC()
cfile = cipher.enc(pfile)
print("Cipher key : |%s| " % cipher.key)
print("Cipher iv : |%s|" % cipher.iv)
fd1 = open(cfile, 'rb')
fd2 = open(cfile2, 'wb')
for i in (cipher.key, cipher.iv, fd1.read()):
fd2.write(i)
fd2.close()
cmd = 'nc -q 2 127.0.0.1 7979 < %s' % cfile2
ret = os.system(cmd)
if ret == 0:
print('[ OK ] The encrypted file send. ')
else:
sys.exit('[ FAIL ] The encrypted file was not send.')
if __name__ == '__main__':
main()
(보내는 쪽 - 송신 측)
File1(평문파일) --> file.in(암호파일) ---- nc CMD ---->
(수신하는 쪽 - 수신 측)
---- nc CMD ----> file.out(암호파일) --> File2(평문파일)
⑦ serverDES.py 개발
DES3FromFile.py 에 아래내용 추가
def dec2(self, cfile, key, iv):
pfile = cfile + '.dec'
fd1 = open(cfile, 'rb')
ciphertext = fd1.read()
fd1.close()
cipher2 = DES3.new(key, DES3.MODE_CBC, iv)
plaintext = unpad(cipher2.decrypt(ciphertext), 8)
fd2 = open(pfile, 'wb')
fd2.write(plaintext)
fd2.close()
return pfile
serverDES.py
##!/usr/bin/python3
import os
import sys
try:
import DES3FromFile
except Exception as e:
print('Error:', e)
sys.exit(1)
def main():
# Cliect : pfile(ptext) -> E(pfile) -> cfile(ctext) -> nc CMD ->
# Server : nc CMD -> cfile(ctext) -> D(ctext) -> pfile(ptext)
cfile = 'plain.enc3'
cfile2 = 'plain.enc4'
cmd = 'nc -lp 7979 > %s' % cfile
ret = os.system(cmd)
if ret == 0:
print('[ OK ] The encrypted file was received.')
else:
print('[ FAIL ] The encrypted file was not received.')
fd1 = open(cfile, 'rb')
results = []
for i in (24, 8, -1):
results.append(fd1.read(i))
key = results[0]
iv = results[1]
ctext = results[2]
fd2 = open(cfile2, 'wb')
fd2.write(ctext)
fd2.close()
cipher = DES3FromFile.MyDES3_CBC()
pfile = cipher.dec2(cfile2, key, iv)
if __name__ == '__main__':
main()
[참고] Socket Programming 작업하기
serverDES.py, clientDES.py 파일에서 nc CMD를 사용하였는데, 이 부분의 code를 직접 socket programming으로 대치할 수 있다.
'현대 암호학' 카테고리의 다른 글
[현대 암호학] 06. 공개 키 암호 - 1. 키 배송 문제 / 2. 공개 키 암호 (0) | 2021.06.28 |
---|---|
[현대 암호학] 05. 실습(5) (0) | 2021.06.24 |
[현대 암호학] 05. 실습(3) (0) | 2021.06.24 |
[현대 암호학] 05. 실습(2) (0) | 2021.06.23 |
[현대 암호학] 05. 실습(1) (0) | 2021.06.23 |