Passwordの暗号化&復号化 - lucen2k/python GitHub Wiki

Install

$ pip install pycryptodome

Source

import base64, re
from Crypto.Cipher import AES
from Crypto import Random

class AESCipher:

    def __init__(self):
        SECRET_KEY = 'ImWU4MDCdUefjSqecjs3sP9h/tKxqHx0efNm12ADsOd8MVx1PMqVajQQPCNsdink'
        self.key = SECRET_KEY[:16]
        self.blk_sz = 32

    def encrypt(self, raw):
        if raw is None or len(raw) == 0:
            raise NameError("No value given to encrypt")
        raw = raw + '\0' * (self.blk_sz - len(raw) % self.blk_sz)
        raw = raw.encode('utf-8')
        iv = Random.new().read(AES.block_size)
        cipher = AES.new(self.key.encode('utf-8'), AES.MODE_CBC, iv)
        return base64.b64encode(iv + cipher.encrypt(raw)).decode('utf-8')

    def decrypt(self, enc):
        if enc is None or len(enc) == 0:
            raise NameError("No value given to decrypt")
        enc = base64.b64decode(enc)
        iv = enc[:16]
        cipher = AES.new(self.key.encode('utf-8'), AES.MODE_CBC, iv )
        return re.sub(b'\x00*$', b'', cipher.decrypt(enc[16:])).decode('utf-8')

# パスワード
password = 'password111'

aes = AESCipher()
# 暗号化
encryp_msg = aes.encrypt()
print(encryp_msg)

# 復号化
msg = aes.decrypt( encryp_msg )
print(msg)

Source修正

import base64, re
from Cryptodome.Cipher import AES
from Cryptodome import Random

class AESCipher:

    def __init__(self, SECRET_KEY):
        self.key = SECRET_KEY[:16]
        self.blk_sz = 32

    def encrypt(self, raw):
        if raw is None or len(raw) == 0:
            raise NameError("No value given to encrypt")
        raw = raw + '\0' * (self.blk_sz - len(raw) % self.blk_sz)
        raw = raw.encode('utf-8')
        iv = Random.new().read(AES.block_size)
        cipher = AES.new(self.key.encode('utf-8'), AES.MODE_CBC, iv)
        return base64.b64encode(iv + cipher.encrypt(raw)).decode('utf-8')

    def decrypt(self, enc):
        if enc is None or len(enc) == 0:
            raise NameError("No value given to decrypt")
        enc = base64.b64decode(enc)
        iv = enc[:16]
        cipher = AES.new(self.key.encode('utf-8'), AES.MODE_CBC, iv )
        return re.sub(b'\x00*$', b'', cipher.decrypt(enc[16:])).decode('utf-8')

"""
# パスワード
password = 'password111'

aes = AESCipher('ImWU4MDCdUefjSqecjs3sP9h/tKxqHx0efNm12ADsOd8MVx1PMqVajQQPCNsdink')
# 暗号化
encryp_msg = aes.encrypt(password)
print(encryp_msg)

# 復号化
msg = aes.decrypt(encryp_msg)
print(msg)
"""

実行結果

LP60PkZCJgZGbnLZ5TFah45KvKS5Wx+dkXlT8bYew1BdlBLWoq+V8w5GcoeVuZuB
password111