[목차]
1. 3DES 프로그램 개발
참고 사이트
https://pycryptodome.readthedocs.io/
https://pycryptodome.readthedocs.io/en/latest/src/cipher/des.html
https://pycryptodome.readthedocs.io/en/latest/src/cipher/des3.html
https://pycryptodome.readthedocs.io/en/latest/src/cipher/aes.html
[3DES 프로그램 개발]
3DES(TDES)-CBC 사용하여 메시지를 암복호화 하는 프로그램 개발
■ 3DES(TDES, DES-3, DES3)사용하는 메세지를 암호화 또는 복호화 하는 프로그램 제작
프로그램 제작시 다음과 같은 사항에 대해서 참고하여야 한다.
1) 3DES(Triple DES)
입력 : 8 bytes (64 bits) 평문 입력
출력 : 8 bytes (64 bits) 암호문 출력
블록 단위 : 8 bytes (64 bits)
키 길이 : 24bytes (K1(8) + K2(8) + K3(8))
[참고] 3DES-EDE2, 3DES-EDE3
2) Block Cipher Mode : CBC
IV : 8 bytes(64 bits)의 iv 필요
Padding : 패딩(padding)에 대한 처리(암호화: pad, 복호화: unpad)
3) PyCryptodome 패키지에서 byte string(EX: b'hello world') 사용해야 한다.
plaintext, keytext, ivtext는 encode('utf-8') 필요
1. DES3FromMsg.py
# 1) Choose Cipher : DES3 (triple DES) - EDE3(encrypt,decrypt,encrypt)
# * plaintext : 8 bytes
# * cihertext : 8 bytes
# * key : 8 bytes (8 * 3 = 24 bytes)
# 2) Choose Block Cipher Mode : CBC
# * IV : 8 bytes
# * padding(pad/unpad)
from Crypto.Cipher import DES3 as DES
from Crypto.Hash import SHA256 as SHA # SH 2버전의 256(해시값의 키의 길이/비트수)
# (1) Encryption Side
# 준비 사항: 평문(plaintext), key, iv
plaintext = 'We are no longer the knights who say ni!'
keytext = 'samsjang'
ivtext = '123456789'
# Msg 준비 : msg 인코딩
msg = plaintext.encode('utf-8') # 파이썬 3버전부터 utf8이 기본값
# Key 준비 : key 인코딩
hash = SHA.new()
hash.update(keytext.encode()) # 업데이트 해주면 hash값이 나온다
key = hash.digest()
#print(key)
#print(len(key))
key = key[:24] # 32바이트로 설정되어 있는데 24바이트만 필요하기 떄문에 24바이트로 짤라준다.
# IV 준비 : iv 인코딩
hash.update(ivtext.encode())
iv = hash.digest()
iv = iv[:8]
#DES3 암호화
cipher = DES.new(key, DES.MODE_CBC, iv)
enc_msg = cipher.encrypt(msg)
print('Plaintext: ', plaintext)
print('Ciphertext: ', enc_msg)
# (2) Decryption Side
# 상대편 암호문, iv, key 필요
recv_enc_msg = enc_msg
recv_iv = iv
recv_key = key
# DES3 복호화
plain = DES.new(recv_key, DES.MODE_CBC, recv_iv)
dec_msg = plain.decrypt(recv_enc_msg)
print('Decrypted: ', dec_msg)
* 중간 중간 디버깅 모드로 실행해서 확인하기
2. class + 함수(메소드)로 변경하여 제작
DES3FromMsg2.py
from Crypto.Cipher import DES3 as DES
from Crypto.Hash import SHA256 as SHA
class MyDES(): #상속받는게 없으니 괄호 빼도됨
def __init__(self, key, iv, msg):
myhash = SHA.new()
myhash.update(key.encode())
tkey = myhash.digest()
self.key = tkey[:24] # self = 전역변수로 사용됨. key '' 이렇게 클래스 바로 밑에 정의해 둬도 됨
myhash.update(iv.encode())
tiv = myhash.digest()
self.iv = tiv[:8]
#self.en_msg = msg.encode()
def enc(self, msg):
des3 = DES.new(self.key, DES.MODE_CBC, self.iv)
encmsg = des3.encrypt(msg.encode())
return encmsg
def dec(self, msg):
des3 = DES.new(self.key, DES.MODE_CBC, self.iv)
decmsg = des3.decrypt(msg)
return decmsg.decode()
def main():
mymsg = 'We are no longer the knights who say ni!'
mykey = 'samsjang'
myiv = '1234'
mycipher = MyDES(mykey, myiv, mymsg)
ciphered = mycipher.enc(mymsg)
deciphered = mycipher.dec(ciphered)
print('Original :', mymsg)
print('Encrypted :', ciphered)
print('Decrypted :', deciphered)
if __name__ == '__main__':
main()
'정보보안공부 > 정보보안전문과정' 카테고리의 다른 글
정보보안 과정 Day 82 : 암복호화 파일저장 및 통신1 (0) | 2021.01.04 |
---|---|
정보보안 과정 Day81 : 3DES/ AES 실습 (0) | 2020.12.31 |
정보보안 과정 Day80 : 암호학 5 (0) | 2020.12.30 |
정보보안 과정 Day79 : 암호학 4 (0) | 2020.12.29 |
정보보안 과정 Day78 : 암호학 3 (0) | 2020.12.28 |