본문 바로가기
Computer Science/language

[python] pycryptodome 모듈을 활용 한 AES 알고리즘 구현

by yeong-yi 2025. 5. 24.
Contents

윈도우 커맨드 창에서 pycryptodome 모듈을 import한다.

pip install pycryptodome

 

Successfully installed pycryptodome-3.23.0

→ 설치가 성공적으로 되었음을 확인할 수 있다.

파이썬 쉘 창에서 import Crypto 명령을 적었을 때 성공적으로 모듈이 호출됨을 확인

from Crypto.Cipher import AES
from Crypto.Hash import SHA256 as SHA

class myAES():
    def __init__(self, keytext, ivtext):
        hash = SHA.new()
        hash.update(keytext.encode('utf-8'))
        key=hash.digest()
        self.key = key[:16]
        
        hash.update(ivtext.encode('utf-8'))
        iv=hash.digest()
        self.iv=iv[:16]

    def makeEnabled(self, plaintext):
        fillersize = 0
        textsize = len(plaintext)
        if textsize%16 != 0:
            fillersize = 16-textsize%16
        filler = '0'*fillersize
        header = '%d' % (fillersize)
        gap = 16-len(header)
        header += '#'*gap

        return header+plaintext+filler
        
    def enc(self, plaintext):
        plaintext = self.makeEnabled(plaintext)
        aes = AES.new(self.key, AES.MODE_CBC, self.iv)
        encmsg = aes.encrypt(plaintext.encode())
        return encmsg

    def dec(self, ciphertext):
        aes = AES.new(self.key, AES.MODE_CBC, self.iv)
        decmsg = aes.decrypt(ciphertext)

        header = decmsg [:16].decode()
        fillersize = int(header.split('#')[0])
        if fillersize != 0:
            decmsg = decmsg[16:-fillersize]
        return decmsg

def main():
    keytext = 'samsjang'
    ivtext = '1234'
    msg = 'python3x'

    myCipher = myAES(keytext, ivtext)
    ciphered = myCipher.enc(msg)
    deciphered = myCipher.dec(ciphered)
    print('ORIGINAL:\t%s'%msg)
    print('CIPHERED:\t%s'%ciphered)
    print('DECIPHERED:\t%s'%deciphered)

if __name__ == '__main__':
    main()

 

단문 메시지를 읽고 AES CBC 모드로 암호화 및 복호화 하는 프로그램이다.

메시지 길이에 상관없이 암호화가 가능하도록 메시지 길이를 16바이트 배수로 만들고 이에 대한 헤더 정보를 포함해 암호화 진행

복호화를 수행하면 원래 메시지로 복원된다.


<주요 코드 간단한 설명>

 

 

AES는 블록 암호 방식 중 하나로, 키(key)와 초기화 벡터(IV)가 필요하다

보안 강화를 위해 keytext(텍스트로 된 키)와 iv(텍스트로 된 초기벡터)를 해시(hash)로 변환한 뒤 암호화/복호화에 사용한다.

 

class myAES:

myAES는 AES 암호 복호화를 담당하는 사용자 정의 클래스

객체지향 언어에서 클래스는 관련 기능을 하나의 단위로 묶을 수 있다.

 

__init__(keytext, ivtext):

keytext와 ivtext를 SHA-256 해시로 변환 한다.

각각의 해시값에서 앞 16바이트 AES키와 IV로 사용

 

makeEnabled(plaintext):

16바이트 블록 단위를 맞추기 위해 헤더 + 패딩(0) 추가

 

enc(plain):

평문->makeEnabled() 처리 후 AES CBC 모드로 암호화, 바이트 형식의 암호문 반환

 

main():

myAES 객체 생성

메시지 암호 복호화 실행 후 결과 출력

 


 

코드 작성 후 돌려보니 에러가 났다

계속 에러 검색하고 읽어보던 중 처음 cmd창에서 모듈 설치하고 notice에 적혀있는 얘기를 이제야 읽었다

 

 

파이썬 업데이트 하고 다시 돌리니 정상적으로 AES 알고리즘 암호 복호화가 진행됨을 확인했다