Created
February 2, 2016 17:37
-
-
Save TakayoshiMiyamoto/4c17cce4d71b074d93f5 to your computer and use it in GitHub Desktop.
Python Multi-byte aes crypto
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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:])] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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