Skip to content

Instantly share code, notes, and snippets.

@TakayoshiMiyamoto
Created February 2, 2016 17:37
Show Gist options
  • Save TakayoshiMiyamoto/4c17cce4d71b074d93f5 to your computer and use it in GitHub Desktop.
Save TakayoshiMiyamoto/4c17cce4d71b074d93f5 to your computer and use it in GitHub Desktop.
Python Multi-byte aes crypto
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import base64
from Crypto import Random
from Crypto.Cipher import AES
# Block size
BS = 32
class AESCrypto(object):
def __init__(self, key):
if len(key) >= len(str(BS)):
self.key = key[:BS]
else:
self.key = AESCrypto._pad(key)
def encrypt(self, raw, iv=0):
raw = AESCrypto._pad(raw)
if iv is 0:
iv = Random.new().read(AES.block_size)
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return base64.b64encode(iv + cipher.encrypt(raw))
def mb_encrypt(self, raw, iv=0):
raw = base64.b64encode(raw.encode('utf-8')).decode('utf-8')
raw = AESCrypto._pad(raw)
if iv is 0:
iv = Random.new().read(AES.block_size)
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return base64.b64encode(iv + cipher.encrypt(raw))
def decrypt(self, enc, iv=0):
enc = base64.b64decode(enc)
if iv is 0:
iv = enc[:AES.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return AESCrypto._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')
def mb_decrypt(self, enc, iv=0):
enc = base64.b64decode(enc)
if iv is 0:
iv = enc[:AES.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
decrypt_enc = AESCrypto._unpad(cipher.decrypt(enc[AES.block_size:]))
return base64.b64decode(decrypt_enc).decode('utf-8')
@staticmethod
def _pad(s):
return s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
@staticmethod
def _unpad(s):
return s[:-ord(s[len(s)-1:])]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unittest
from aes_crypto import AESCrypto
class TestAESCrypto(unittest.TestCase):
def setUp(self):
pass
def test_encrypt_decrypt(self):
plan_string = 'demo.test-0123456789@gmail.com'
cipher = AESCrypto('oxrBXlJ5k35ytZVZSwJv0O8BiQJYZnVFgnCCofC3nI3SONCxA0')
# Encrypt
encrypt_string = cipher.encrypt(plan_string)
self.assertIsNotNone(encrypt_string)
self.assertNotEqual(encrypt_string, plan_string)
# Decrypt
decrypt_string = cipher.decrypt(encrypt_string)
self.assertIsNotNone(decrypt_string)
self.assertEqual(decrypt_string, plan_string)
def test_mb_encrypt_decrypt(self):
plan_string = 'भारत中国中國日本語にほんごニホンゴ한국어جزيره العرب'
cipher = AESCrypto('oxrBXlJ5k35ytZVZSwJv0O8BiQJYZnVFgnCCofC3nI3SONCxA0')
# Encrypt
encrypt_string = cipher.mb_encrypt(plan_string)
self.assertIsNotNone(encrypt_string)
self.assertNotEqual(encrypt_string, plan_string)
# Decrypt
decrypt_string = cipher.mb_decrypt(encrypt_string)
self.assertIsNotNone(decrypt_string)
self.assertEqual(decrypt_string, plan_string)
if __name__ == '__main__':
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment