お手軽暗号化

pythonGUIを書いていて、パスワードを生値で保存したくないなぁって思ったので、AESとかで仰々しいものを作った。 作ってからもっとお手軽でいいかなと思い直して調べた結果を残しておく

_data = "TestData123456"

import codecs

enc = codecs.encode(_data, "rot_13")
print(enc)
print(codecs.decode(enc, "rot_13"))

要件を満たさないんで結局書きなおした。。。

import base64
import hashlib

from Crypto import Random
from Crypto.Cipher import AES


class CryptAES:
    def __init__(self, key):
        self.block_size = AES.block_size
        self.secret_key = self._create_key(key)

    def _padding(self, text):
        if not text:
            return text
        else:
            odd = self.block_size - len(text) % self.block_size
            odd_char = odd * chr(odd)
            return text + odd_char

    def _unpadding(self, text):
        if not text:
            return text
        else:
            return text[:-ord(text[len(text) - 1:])]

    def _normalize_key(self, local_key):
        if len(local_key) >= self.block_size:
            new_key = local_key[:self.block_size]
        else:
            new_key = self._padding(local_key)
        return new_key

    def _create_key(self, local_key):
        local_key = self._normalize_key(local_key)
        secret_key = hashlib.sha256(local_key.encode()).digest()
        return secret_key

    def _create_iv(self):
        iv = Random.new().read(self.block_size)
        return iv


class EncryptAES(CryptAES):
    def cipher(self, data):
        iv = self._create_iv()
        raw_data = self._padding(data)
        aes = AES.new(self.secret_key, AES.MODE_CBC, iv)
        encrypt_data = aes.encrypt(raw_data)
        return base64.b64encode(iv + b"<?>" + encrypt_data).decode("unicode_escape")


class DecryptAES(CryptAES):
    def cipher(self, data):
        data = base64.b64decode(data.encode("unicode_escape"))
        iv, encrypt_data = data.split(b"<?>")
        aes = AES.new(self.secret_key, AES.MODE_CBC, iv)
        raw_data = aes.decrypt(encrypt_data)
        return self._unpadding(raw_data).decode("unicode_escape")


if __name__ == '__main__':
    _key = "AES sample key"
    _data = "TestData123456"

    enc = EncryptAES(_key)
    enc_data = enc.cipher(_data)
    print(enc_data)

    dec = DecryptAES(_key)
    dec_data = dec.cipher(enc_data)
    print(dec_data)