Browse Source

AES: use PyCrypto if available

master
ThomasV 9 years ago
parent
commit
7e76e4ac55
  1. 41
      lib/bitcoin.py

41
lib/bitcoin.py

@ -74,19 +74,42 @@ TYPE_ADDRESS = 0
TYPE_PUBKEY = 1 TYPE_PUBKEY = 1
TYPE_SCRIPT = 2 TYPE_SCRIPT = 2
# AES encryption # AES encryption
try:
from Crypto.Cipher import AES
except:
AES = None
def aes_encrypt_with_iv(key, iv, data): def aes_encrypt_with_iv(key, iv, data):
aes_cbc = pyaes.AESModeOfOperationCBC(key, iv=iv) if AES:
aes = pyaes.Encrypter(aes_cbc) AES.block_size = 16
e = aes.feed(data) + aes.feed() # empty aes.feed() appends pkcs padding AES.key_size = 32
return e 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): def aes_decrypt_with_iv(key, iv, data):
aes_cbc = pyaes.AESModeOfOperationCBC(key, iv=iv) if AES:
aes = pyaes.Decrypter(aes_cbc) cipher = AES.new(key, AES.MODE_CBC, iv)
s = aes.feed(data) + aes.feed() # empty aes.feed() strips pkcs padding data = cipher.decrypt(data)
return s 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): def EncodeAES(secret, s):
iv = bytes(os.urandom(16)) iv = bytes(os.urandom(16))

Loading…
Cancel
Save