diff --git a/lib/bitcoin.py b/lib/bitcoin.py index 0822a228..c2cfe36a 100644 --- a/lib/bitcoin.py +++ b/lib/bitcoin.py @@ -74,19 +74,42 @@ TYPE_ADDRESS = 0 TYPE_PUBKEY = 1 TYPE_SCRIPT = 2 - # AES encryption +try: + from Crypto.Cipher import AES +except: + AES = None + def aes_encrypt_with_iv(key, iv, data): - aes_cbc = pyaes.AESModeOfOperationCBC(key, iv=iv) - aes = pyaes.Encrypter(aes_cbc) - e = aes.feed(data) + aes.feed() # empty aes.feed() appends pkcs padding - return e + if AES: + AES.block_size = 16 + AES.key_size = 32 + padlen = 16 - (len(data) % 16) + if padlen == 0: + padlen = 16 + data += chr(padlen) * padlen + e = AES.new(key, AES.MODE_CBC, iv).encrypt(data) + return e + else: + aes_cbc = pyaes.AESModeOfOperationCBC(key, iv=iv) + aes = pyaes.Encrypter(aes_cbc) + e = aes.feed(data) + aes.feed() # empty aes.feed() appends pkcs padding + return e def aes_decrypt_with_iv(key, iv, data): - aes_cbc = pyaes.AESModeOfOperationCBC(key, iv=iv) - aes = pyaes.Decrypter(aes_cbc) - s = aes.feed(data) + aes.feed() # empty aes.feed() strips pkcs padding - return s + if AES: + cipher = AES.new(key, AES.MODE_CBC, iv) + data = cipher.decrypt(data) + padlen = ord(data[-1]) + for i in data[-padlen:]: + if ord(i) != padlen: + raise InvalidPassword() + return data[0:-padlen] + else: + aes_cbc = pyaes.AESModeOfOperationCBC(key, iv=iv) + aes = pyaes.Decrypter(aes_cbc) + s = aes.feed(data) + aes.feed() # empty aes.feed() strips pkcs padding + return s def EncodeAES(secret, s): iv = bytes(os.urandom(16))