Skip to content

Instantly share code, notes, and snippets.

@hallazzang
Last active August 29, 2015 14:20
Show Gist options
  • Save hallazzang/c89fb4ab85998fd5eba4 to your computer and use it in GitHub Desktop.
Save hallazzang/c89fb4ab85998fd5eba4 to your computer and use it in GitHub Desktop.
Python object locker

Python object locker

It is python object locker, literally.

Example

from locker import Locker

foo = 'Hello, world!'

locker = Locker('somepassword')
locked = locker.lock(foo)
print 'locked result: {}'.format(locked)

unlocked = locker.unlock(locked)
print 'unlocked result: {}'.format(unlocked)

Remark

Use it with getpass module in your script, then nobody can unlock the locked result without knowing password.

try:
import cPickle as pickle
except ImportError:
import pickle
import zlib
from Crypto.Cipher import AES
from Crypto.Hash import MD5
from Crypto import Random
from base64 import b64encode, b64decode
class Locker(object):
AES_BLOCK_SIZE = 16
def __init__(self, key):
self._key_md5 = MD5.new(key).hexdigest()
def lock(self, data):
try: return self._aes_encrypt(zlib.compress(pickle.dumps(data)))
except: return None
def unlock(self, data):
try: return pickle.loads(zlib.decompress(self._aes_decrypt(data)))
except: return None
def _aes_encrypt(self, data):
iv = Random.new().read(self.AES_BLOCK_SIZE)
aes = AES.new(self._key_md5, AES.MODE_CBC, iv)
return b64encode(iv + aes.encrypt(self._pad(data)))
def _aes_decrypt(self, data):
data = b64decode(data)
iv = data[:16]
aes = AES.new(self._key_md5, AES.MODE_CBC, iv)
return self._unpad(aes.decrypt(data[16:]))
def _pad(self, data):
l = self.AES_BLOCK_SIZE - len(data) % self.AES_BLOCK_SIZE
return data + chr(l) * l
def _unpad(self, data):
return data[:-ord(data[len(data) - 1:])]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment