[목차]

 

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()

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts