お手軽暗号化
pythonでGUIを書いていて、パスワードを生値で保存したくないなぁって思ったので、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)