dialogflow-cx/vpc-sc-auth-server/server/aes_cipher.py (24 lines of code) (raw):

# Copyright 2022 Google LLC # # Licensed under the Apache License, Version 2.0 (the 'License'); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an 'AS IS' BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Encrypt and decrypt with AES.""" import base64 import uuid from Crypto import Random from Crypto.Cipher import AES class AESCipher: """Organizes AES encryption methods.""" def __init__(self, key=None, block_size=16): self.key = uuid.uuid4().hex.encode() if key is None else key self.block_size = block_size def pad(self, cstr): """Pad message if needed.""" return cstr + (self.block_size - len(cstr) % self.block_size) * chr( self.block_size - len(cstr) % self.block_size ) def unpad(self, cstr): """Unpad padded message.""" return cstr[: -ord(cstr[len(cstr) - 1 :])] # noqa: E203 def encrypt(self, raw): """Encrypt plaintext.""" raw = self.pad(raw).encode() init_vec = Random.new().read(AES.block_size) cipher = AES.new(self.key, AES.MODE_CBC, init_vec) return base64.b64encode(init_vec + cipher.encrypt(raw)) def decrypt(self, enc): """Decrypt cyphertext.""" enc = base64.b64decode(enc) init_vec = enc[:16] cipher = AES.new(self.key, AES.MODE_CBC, init_vec) return self.unpad(cipher.decrypt(enc[16:]))