[목차]

 

 

 

1. 3DES(TDES) 사용하여 파일에 암복호화 저장하기

2. AES를 사용해 암복호화 후 파일에 저장

3. nc CMD 사용한 DES 암복호화 서버/클라이언트 만들기

4. 소켓 프로그래밍

 

 


 

 

 

 

[3DES(TDES) 사용하여 파일에 암복호화 저장하기]

 

 

# Cipher Algorithm : DES3
#   * input     : 8 bytes (56 bits)
#   * output    : 8 bytes
#   * key       : 8 + 8 + 8 = 24 bytes
# Cipher Mode   : CBC
#   * IV        : 8 bytes
#   * padding   : pad, unpad
#

from Crypto.Cipher import DES3
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad

class MyDES3_CBC:
    def __init__(self):
        self.iv = get_random_bytes(8)
        self.key = get_random_bytes(24)

    def enc(self, file):
        encfile = file + '.enc'

        fd1 = open(file, 'rb')
        fd2 = open(encfile, 'wb')

        filecontent = fd1.read()
        # print(filecontent)
        cipher = DES3.new(self.key, DES3.MODE_CBC, self.iv)
        ciphertext = cipher.encrypt(pad(filecontent, 8))

        fd2.write(ciphertext)

        fd1.close()
        fd2.close()

        return encfile


    def dec(self, file):
        decfile = file + '.dec'

        fd1 = open(file, 'rb')
        fd2 = open(decfile, 'wt+')

        filecontent = fd1.read()

        des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)
        plaintext = unpad(des3.decrypt(filecontent), 8)
        # print(plaintext) ; input()
        fd2.write(plaintext.decode('utf-8'))

        fd1.close()
        fd2.close()

        return decfile

def main():
    # Encryption:
    #   file(plain.txt) -> msg -> E(msg) -> enc_msg -> file(plain.txt.enc)
    # Decryption:
    #   file(plain.txt.enc) -> enc_msg -> D(enc_msg) -> msg -> file(plain.txt.enc.dec)

    myfile = 'Plaintext.txt'

    des3 = MyDES3_CBC()
    myencfile = des3.enc(myfile)
    print("Plaintext file: ", open(myfile, 'rt').read())
    print("Encrypted file: ", open(myencfile, 'rb').read())

    mydecfile = des3.dec(myencfile)
    print("Decrypted file: ", open(mydecfile, 'rt').read())

if __name__ == '__main__':
    main()

 

 

 

 


 

 

 

 

[AES를 사용해 암복호화 후 파일에 저장]

 

 

 

#1 기본 틀 짜기

 

# Cipher : AES128
#   * input : 16 bytes
#   * output : 16 bytes
#   * key : 16 bytes
# Cipher Mode : CBC
#   * iv : 16 bytes
#   * padding : pad, unpad


from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad



class MyAES_CBC:
    def __init__(self):
        pass
    
    def enc(self):
        pass
    
    def dec(self):
        pass



def main():
    # Encryption :
    #   file(msg) -> msg -> E(msg) -> enc_msg -> encfile
    # Decryption :
    #   encfile(enc_msg) -> enc_msg -> D(enc_msg) -> file(dec_msg)



if __name__ == '__main__':
    main()

 

#2 채워넣기

# Cipher : AES128
#   * input : 16 bytes
#   * output : 16 bytes
#   * key : 16 bytes
# Cipher Mode : CBC
#   * iv : 16 bytes
#   * padding : pad, unpad

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad

class MyAES_CBC:
    def __init__(self):
        self.iv = get_random_bytes(16)
        self.key = get_random_bytes (16)

    def enc(self, file):
        encfile = file + '.enc'
        fd1 = open(file, 'rb')
        fd2 = open(encfile, 'wb')

        filecontent = fd1.read()
        # print(filecontent)
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
        ciphertext = cipher.encrypt(pad(filecontent, 16))

        fd2.write(ciphertext)

        fd1.close()
        fd2.close()

        return encfile


    def dec(self, file):
        decfile = file + '.dec'

        fd1 = open(file, 'rb')
        fd2 = open(decfile, 'wt+')

        filecontent = fd1.read()

        aes = AES.new(self.key, AES.MODE_CBC, self.iv)
        plaintext = unpad(aes.decrypt(filecontent), 16)
        # print(plaintext)
        fd2.write(plaintext.decode('utf-8'))

        fd1.close()
        fd2.close()

        return decfile

def main():
    # Encryption :
    #   file(msg) -> msg -> E(msg) -> enc_msg -> encfile
    # Decryption :
    #   encfile(enc_msg) -> enc_msg -> D(enc_msg) -> file(dec_msg)

    myfile = 'Plaintext.txt'
    AES = MyAES_CBC()
    myencfile = AES.enc(myfile)
    print("Plaintext file: ", open(myfile, 'rt').read())
    print("Encrypted file: ", open(myencfile, 'rb').read())

    mydecfile = AES.dec(myencfile)
    print("Decrypted file: ", open(mydecfile, 'rt').read())


if __name__ == '__main__':
    main()

 

 

 


 

 

 

[nc CMD 사용한 DES 암복호화 서버/클라이언트 만들기]

 

 

 

*작업 시나리오

칼리리눅스에서 두개의 터미널을 띄우고

하나는 서버(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

 

 

 

 

pliantext.txt

Robin Monroe (Anne Heche) is a New York City journalist who works for Dazzle, a fashion magazine. She is invited by her boyfriend Frank (David Schwimmer) to spend a week holidaying with him on the island paradise of Makatea, in the South Pacific. The final leg of their journey to Makatea is in a dilapidated de Havilland Canada DHC-2 Beaver, piloted by middle-aged American Quinn Harris (Harrison Ford). They are accompanied by Quinn's girlfriend and co-pilot Angelica (Jacqueline Obradors). On their first night on the island, Frank proposes to Robin, who happily accepts. At a bar, a drunken Quinn makes a move on Robin, which she rejects as Frank appears.

 

 

 

 

DESFromFile2.py

# Cipher Algorithm : DES3
#   * input     : 8 bytes (56 bits)
#   * output    : 8 bytes
#   * key       : 8 + 8 + 8 = 24 bytes
# Cipher Mode   : CBC
#   * IV        : 8 bytes
#   * padding   : pad, unpad
#

import os
import sys
from Crypto.Cipher import DES3
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad

class MyDES3_CBC:
    def __init__(self):
        self.iv = get_random_bytes(8)
        self.key = get_random_bytes(24)

    def enc(self, file):
        encfile = file + '.enc'

        fd1 = open(file, 'rb')

        if os.path.exists(encfile):
            os.remove(encfile)

        fd2 = open(encfile, 'ab')

        filecontent = fd1.read()
        # print(filecontent)
        cipher = DES3.new(self.key, DES3.MODE_CBC, self.iv)
        ciphertext = cipher.encrypt(pad(filecontent, 8))

        fd2.write(self.iv)
        fd2.write(self.key)
        fd2.write(ciphertext)

        fd1.close()
        fd2.close()

        # input()
        return encfile


    def dec(self, file):
        decfile = file + '.dec'

        fd1 = open(file, 'rb')
        fd2 = open(decfile, 'wt+')

        iv = fd1.read(8)
        key = fd1.read(24)
        filecontent = fd1.read(-1)

        des3 = DES3.new(key, DES3.MODE_CBC, iv)
        plaintext = unpad(des3.decrypt(filecontent), 8)
        # print(plaintext) ; input()
        fd2.write(plaintext.decode('utf-8'))

        fd1.close()
        fd2.close()

        return decfile

def main():
    # Encryption:
    #   file(plain.txt) -> msg -> E(msg) -> enc_msg -> file(plain.txt.enc)
    # Decryption:
    #   file(plain.txt.enc) -> enc_msg -> D(enc_msg) -> msg -> file(plain.txt.enc.dec)

    myfile = 'Plaintext.txt'

    des3 = MyDES3_CBC()

    myencfile = des3.enc(myfile)
    print("Plaintext file: ", open(myfile, 'rt').read())
    print("Encrypted file: ", open(myencfile, 'rb').read())

    mydecfile = des3.dec(myencfile)
    print("Decrypted file: ", open(mydecfile, 'rt').read())

if __name__ == '__main__':
    main()

 

 

clientDES.py

#!/usr/bin/python3

import os
import sys

# import DESFromFile2
try:
    import DESFromFile2
except Exception as e:
    sys.exit('Error: ', e)


def main():
    # 1) File(Plaintext.txt) -> msg -> E(msg) -> enc_msg -> File(plain.txt.enc)
    # 2) nc -q 2 <IP> 7979 < plain.txt.enc


    # 1) File Encryption
    myfile = 'Plaintext.txt'

    mycipher = DESFromFile2.MyDES3_CBC()
    encfile = mycipher.enc(myfile)
    print("\nPlaintext Filename: ", myfile)
    print("plaintext FIle Content: ")
    print(open(myfile, 'rt').read())

    print("\nEncryption Filename: ", encfile)
    print("Encryption File Content: ")
    print(open(encfile, 'rb').read())

    # File Transsmission
    # nc -q 2 < IP > 7979 < plain.txt.enc
    cmd = "nc -q 2 127.0.0.1 7979 < %s" % encfile
    # print(cmd)
    os.system(cmd)


if __name__ == '__main__':
    main()




 

 

ServerDES.py

#!/usr/bin/python3

import os
import sys

try:
    import DESFromFile2
except Exception as e:
    sys.exit('Error: ', e)


def main():
    # nc -lp 7979 > plain.txt.enc.dec
    # plain.txt.enc.dec -> enc_msg -> D(enc_msg) -> dec_msg -> File(dec_msg)

    # 1) File recieved
    encfile = 'plain2.txt.enc'
    cmd = 'nc -lp 7979 > %s' % encfile
    # print(cmd)
    os.system(cmd)

    # 2) Decrypt File
    mycipher = DESFromFile2.MyDES3_CBC()
    decfile = mycipher.dec(encfile)
    print("\nEncrypted File Name: ", encfile)
    print("Encryption File: ")
    print(open(encfile, 'rb').read())

    print("\nDecrypted File Name: ", decfile)
    print("Decryption File: ")
    print(open(decfile, 'rt').read())


if __name__ == '__main__':
    main()

 

 

 


 

 

 

[소켓 프로그래밍]

 

 

 

* serverDES.py, clientDES.py 파일에서 nc CMD를 사용하였는데,

이 부분의 code를 직접 socket programming으로 대치할 수 있다.

 

 

 

① 서버에서는 socket(), bind(), listen(), accept()순으로 함수들을 호출하여 리스닝 소켓을 생성한다. 리스닝 소켓은 클라이언트의 접속을 대기하는 역할을 한다.

 

② 클라이언트가 연결되면 accept()에서 새로운 소켓을 리턴하여 클라이언트와 통신시 사용하도록 한다.

 

③ 클라이언트는 connect() 함수를 호출하여 서버에 연결을 시도한다. 이때부터 3-way 핸드세이크를 시작한다. 핸드 세이크는 네트워크를 통해 양쪽이 연결되는 것을 보장하므로 중요하다. 클라이언트가 서버에 도달할 수 있으며 그 반대도 마찬가지이다.

 

④ 연결이 완료된 후, 서버와 클라이언트는 send() 함수와 recv() 함수를 호출하여 데이터를 주고 받는다.

 

⑤ 클라이언트가 연결 종료 메시지를 전송하거나 소켓을 닫으면 서버는 클라이언트와 통신을 위해 사용한 소켓을 닫는다.

 

 

 

 

[예제1] 간단한 메세지 전송

 

■ 메세지 받는 서버

server.py

import socket

host = '127.0.0.1'
port = 4444

s = socket.socket()
s.bind((host, port))
s.listen(1)
client, address = s.accept()
print("Connected by ", address)

recv_msg = b''
while True:
    data = client.recv(1024)
    if not data:
        clent.close()
        break
    recv_msg += data

print("Client Message Length", len(recv_msg))
print("Client Message Content: ")
print(recv_msg)
s.close()

 


client.py

■ 메세지 전송 클라이언트

import socket

host = '127.0.0.1'
port = 4444

s = socket.socket()
s.connect((host, port))
s.sendall(open('Plaintext.txt', 'rb').read())
s.close()

 

 

 

 

* server.py, client.py 코드에 에러처리 구문 추가 프로그램 예제.

 

서버.py

 

 

 

 

import socket
import sys

host = '127.0.0.1'
port = 4444

try:
    s = socket.socket()
    s.connect((host, port))
except Exception as e:
    sys.exit("Error: ", e)
else:    
    s.sendall(open('Plaintext.txt', 'rb').read())
finally:
    s.close()

 

 

클라이언트.py

import socket
import sys

host = '127.0.0.1'
port = 4444

try:
    s = socket.socket()
    s.bind((host, port))
    s.listen(1)
    client, address = s.accept()
    print("Connected by ", address)
except Exception as e:
    sys.exit("Error: ", e)
else:
    recv_msg = b''
    while True:
        data = client.recv(1024)
        if not data:
            clent.close()
            break
        recv_msg += data
    
    print("Client Message Length", len(recv_msg))
    print("Client Message Content: ")
    print(recv_msg)
finally: 
    s.close()

 

 


 

 

 

 

 

728x90

+ Recent posts