Study Record

[암호 프로그래밍] AES 암호화/복호화 프로그램 본문

암호/프로그래밍

[암호 프로그래밍] AES 암호화/복호화 프로그램

초코초코초코 2021. 12. 3. 10:04
728x90

AES-CBC 암호화/복호화 프로그램

# AES-CBC
# Cipher Algorithm : AES
#   * input  : 16 bytes (128bits)
#   * output : 16 bytes (128bits)
#   * key    : 128 bits(16), 192 bits(24), 256 bits(32)
# * Cipher Mode : CBC
#   * iv     : 16 bytes
#   * pad, unpad
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad


class MyAES:
    # MyAES(keysize, ivsize)
    def __init__(self, keysize, ivsize):
        self.key = get_random_bytes(keysize)
        self.iv = get_random_bytes(ivsize)
        self.msgsize = ivsize
        pass

    def enc(self, msg):
        c = AES.new(self.key, AES.MODE_CBC, self.iv)
        return c.encrypt(pad(msg.encode(), self.msgsize))

    def dec(self, encMsg):
        c = AES.new(self.key, AES.MODE_CBC, self.iv)
        return unpad(c.decrypt(encMsg), self.msgsize).decode()


def main():
    mymsg = "We are no longer the knights who say nice!"

    aes = MyAES(16, 16)
    ensMsg = aes.enc(mymsg)
    decMsg = aes.dec(ensMsg)
    print(mymsg)
    print(ensMsg)
    print(decMsg)
    pass


if __name__ == '__main__':
    main()

AES-CTR 암호화/복호화 프로그램

# AES-CTR
# Cipher Algorithm : AES
#   * input  : 16 bytes (128bits)
#   * output : 16 bytes (128bits)
#   * key    : 128 bits(16), 192 bits(24), 256 bits(32)
# * Cipher Mode : CTR
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import json
from base64 import b64decode, b64encode


def main():
    mymsg = b"samsjang!"
    key = get_random_bytes(16)
    cipher = AES.new(key, AES.MODE_CTR)
    nonce = cipher.nonce

    endMsg = cipher.encrypt(mymsg)

    # Key, nonce, encMsg
    sendKey = b64encode(key).decode()
    sendNonce = b64encode(nonce).decode()
    sendMsg = b64encode(endMsg).decode()

    data = {'nonce': sendNonce, 'message': sendMsg, 'key': sendKey}
    sendData = json.dumps(data)
    print(sendData)

    # Receiver site -> Decryption
    recvData = sendData
    b64 = json.loads(recvData)

    recvKey = b64decode(b64['key'])
    recvNonce = b64decode(b64['nonce'])
    recvMsg = b64decode(b64['message'])

    decMsg = AES.new(recvKey, AES.MODE_CTR, nonce=recvNonce).decrypt(recvMsg)
    print(decMsg)

    pass


if __name__ == "__main__":
    main()
728x90