[목차]
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()
'정보보안공부 > 정보보안전문과정' 카테고리의 다른 글
정보보안 과정 Day84 : 파일 암호화 프로그램 제작 (0) | 2021.01.06 |
---|---|
정보보안 과정 Day 83 : 암복호화 파일저장 및 통신2 (0) | 2021.01.05 |
정보보안 과정 Day81 : 3DES/ AES 실습 (0) | 2020.12.31 |
정보보안 과정 Day80-1 : 3DES 실습 (0) | 2020.12.30 |
정보보안 과정 Day80 : 암호학 5 (0) | 2020.12.30 |