현대 암호학

[현대 암호학] 05. 실습(4)

Uggjjini 2021. 6. 24. 15:13

[실습] 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으로 대치할 수 있다.