-
-
Save swinton/8409454 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python | |
import base64 | |
from Crypto import Random | |
from Crypto.Cipher import AES | |
BS = 16 | |
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) | |
unpad = lambda s : s[0:-ord(s[-1])] | |
class AESCipher: | |
def __init__( self, key ): | |
self.key = key | |
def encrypt( self, raw ): | |
raw = pad(raw) | |
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 ): | |
enc = base64.b64decode(enc) | |
iv = enc[:16] | |
cipher = AES.new(self.key, AES.MODE_CBC, iv ) | |
return unpad(cipher.decrypt( enc[16:] )) | |
cipher = AESCipher('mysecretpassword') | |
encrypted = cipher.encrypt('Secret Message A') | |
decrypted = cipher.decrypt(encrypted) | |
print encrypted | |
print decrypted |
pycrypto==2.6.1 |
Very minor changes to make it python 3 compatible https://gist.github.com/mguezuraga/257a662a51dcde53a267e838e4d387cd
def pad(s):
return s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
def unpad(s):
return s[0:-s[-1]]
lambda removed(pep 8 support)
ord removed(python 3 support)
In Python 3 using the modifications of Craz1k0ek it still doesn't work with Unicode. For example the input Hello, 你好
raises ValueError: Input strings must be a multiple of 16 in length
Edit: found a working version: https://stackoverflow.com/a/44212550
i think this is aes 128, we have a standard blocksize of 16 bytes (128bit)
i can't seem to find how to do aes256
Please provide the JAVA code equivalent to above which is in python.
i think this is aes 128, we have a standard blocksize of 16 bytes (128bit)
Key size decides if it is aes 256 or 128, block size is 16 in both of em
This only works because the 'mysecretpassword' is 16 bytes. If it were a different (not dividable by 16) amount of bytes you'd get
"ValueError: AES key must be either 16, 24, or 32 bytes long"
To avoid this the key may be hashed:
self.key = hashlib.sha256(key.encode('utf-8')).digest()