Untitled diff
0 removals
768 lines
0 additions
768 lines
#!/usr/bin/env python
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#-*- coding: utf-8 -*-
pywversion="2.2"
pywversion="2.2"
never_update=False
never_update=False
#
#
# jackjack's pywallet.py
# jackjack's pywallet.py
# https://github.com/jackjack-jj/pywallet
# https://github.com/jackjack-jj/pywallet
# forked from Joric's pywallet.py
# forked from Joric's pywallet.py
#
#
beta_version = ('a' in pywversion.split('-')[0]) or ('b' in pywversion.split('-')[0])
beta_version = ('a' in pywversion.split('-')[0]) or ('b' in pywversion.split('-')[0])
missing_dep = []
missing_dep = []
try:
try:
from bsddb.db import *
from bsddb.db import *
except:
except:
try:
try:
from bsddb3.db import *
from bsddb3.db import *
except:
except:
missing_dep.append('bsddb')
missing_dep.append('bsddb')
import os, sys, time, re
import os, sys, time, re
pyw_filename = os.path.basename(__file__)
pyw_filename = os.path.basename(__file__)
pyw_path = os.path.dirname(os.path.realpath(__file__))
pyw_path = os.path.dirname(os.path.realpath(__file__))
try:
try:
for i in os.listdir('/usr/lib/python2.5/site-packages'):
for i in os.listdir('/usr/lib/python2.5/site-packages'):
if 'Twisted' in i:
if 'Twisted' in i:
sys.path.append('/usr/lib/python2.5/site-packages/'+i)
sys.path.append('/usr/lib/python2.5/site-packages/'+i)
except:
except:
''
''
try:
try:
import json
import json
except:
except:
try:
try:
import simplejson as json
import simplejson as json
except:
except:
print("Json or simplejson package is needed")
print("Json or simplejson package is needed")
import logging
import logging
import struct
import struct
import StringIO
import StringIO
import traceback
import traceback
import socket
import socket
import types
import types
import string
import string
import exceptions
import exceptions
import hashlib
import hashlib
import random
import random
import urllib
import urllib
import math
import math
try:
try:
from twisted.internet import reactor
from twisted.internet import reactor
from twisted.web import server, resource
from twisted.web import server, resource
from twisted.web.static import File
from twisted.web.static import File
from twisted.python import log
from twisted.python import log
except:
except:
missing_dep.append('twisted')
missing_dep.append('twisted')
from datetime import datetime
from datetime import datetime
from subprocess import *
from subprocess import *
import os
import os
import os.path
import os.path
import platform
import platform
max_version = 81000
max_version = 81000
addrtype = 0
addrtype = 0
json_db = {}
json_db = {}
private_keys = []
private_keys = []
private_hex_keys = []
private_hex_keys = []
passphrase = ""
passphrase = ""
global_merging_message = ["",""]
global_merging_message = ["",""]
balance_site = 'https://blockchain.info/q/addressbalance/'
balance_site = 'https://blockchain.info/q/addressbalance/'
aversions = {};
aversions = {};
for i in range(256):
for i in range(256):
aversions[i] = "version %d" % i;
aversions[i] = "version %d" % i;
aversions[0] = 'Bitcoin';
aversions[0] = 'Bitcoin';
aversions[48] = 'Litecoin';
aversions[48] = 'Litecoin';
aversions[52] = 'Namecoin';
aversions[52] = 'Namecoin';
aversions[111] = 'Testnet';
aversions[111] = 'Testnet';
wallet_dir = ""
wallet_dir = ""
wallet_name = ""
wallet_name = ""
ko = 1e3
ko = 1e3
kio = 1024
kio = 1024
Mo = 1e6
Mo = 1e6
Mio = 1024 ** 2
Mio = 1024 ** 2
Go = 1e9
Go = 1e9
Gio = 1024 ** 3
Gio = 1024 ** 3
To = 1e12
To = 1e12
Tio = 1024 ** 4
Tio = 1024 ** 4
prekeys = ["308201130201010420".decode('hex'), "308201120201010420".decode('hex')]
prekeys = ["308201130201010420".decode('hex'), "308201120201010420".decode('hex')]
postkeys = ["a081a530".decode('hex'), "81a530".decode('hex')]
postkeys = ["a081a530".decode('hex'), "81a530".decode('hex')]
def iais(a):
def iais(a):
if a>= 2:
if a>= 2:
return 's'
return 's'
else:
else:
return ''
return ''
def systype():
def systype():
if platform.system() == "Darwin":
if platform.system() == "Darwin":
return 'Mac'
return 'Mac'
elif platform.system() == "Windows":
elif platform.system() == "Windows":
return 'Win'
return 'Win'
return 'Linux'
return 'Linux'
def determine_db_dir():
def determine_db_dir():
if wallet_dir in "":
if wallet_dir in "":
if platform.system() == "Darwin":
if platform.system() == "Darwin":
return os.path.expanduser("~/Library/Application Support/Bitcoin/")
return os.path.expanduser("~/Library/Application Support/Bitcoin/")
elif platform.system() == "Windows":
elif platform.system() == "Windows":
return os.path.join(os.environ['APPDATA'], "Bitcoin")
return os.path.join(os.environ['APPDATA'], "Bitcoin")
return os.path.expanduser("~/.bitcoin")
return os.path.expanduser("~/.bitcoin")
else:
else:
return wallet_dir
return wallet_dir
def determine_db_name():
def determine_db_name():
if wallet_name in "":
if wallet_name in "":
return "wallet.dat"
return "wallet.dat"
else:
else:
return wallet_name
return wallet_name
########################
########################
# begin of aes.py code #
# begin of aes.py code #
########################
########################
# from the SlowAES project, http://code.google.com/p/slowaes (aes.py)
# from the SlowAES project, http://code.google.com/p/slowaes (aes.py)
def append_PKCS7_padding(s):
def append_PKCS7_padding(s):
"""return s padded to a multiple of 16-bytes by PKCS7 padding"""
"""return s padded to a multiple of 16-bytes by PKCS7 padding"""
numpads = 16 - (len(s)%16)
numpads = 16 - (len(s)%16)
return s + numpads*chr(numpads)
return s + numpads*chr(numpads)
def strip_PKCS7_padding(s):
def strip_PKCS7_padding(s):
"""return s stripped of PKCS7 padding"""
"""return s stripped of PKCS7 padding"""
if len(s)%16 or not s:
if len(s)%16 or not s:
raise ValueError("String of len %d can't be PCKS7-padded" % len(s))
raise ValueError("String of len %d can't be PCKS7-padded" % len(s))
numpads = ord(s[-1])
numpads = ord(s[-1])
if numpads > 16:
if numpads > 16:
raise ValueError("String ending with %r can't be PCKS7-padded" % s[-1])
raise ValueError("String ending with %r can't be PCKS7-padded" % s[-1])
return s[:-numpads]
return s[:-numpads]
class AES(object):
class AES(object):
# valid key sizes
# valid key sizes
keySize = dict(SIZE_128=16, SIZE_192=24, SIZE_256=32)
keySize = dict(SIZE_128=16, SIZE_192=24, SIZE_256=32)
# Rijndael S-box
# Rijndael S-box
sbox = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67,
sbox = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67,
0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59,
0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59,
0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7,
0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7,
0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1,
0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1,
0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05,
0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05,
0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83,
0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83,
0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29,
0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29,
0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa,
0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa,
0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c,
0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c,
0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc,
0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc,
0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19,
0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19,
0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee,
0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee,
0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49,
0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49,
0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4,
0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6,
0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6,
0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70,
0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70,
0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9,
0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9,
0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e,
0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e,
0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1,
0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1,
0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0,
0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0,
0x54, 0xbb, 0x16]
0x54, 0xbb, 0x16]
# Rijndael Inverted S-box
# Rijndael Inverted S-box
rsbox = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3,
rsbox = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3,
0x9e, 0x81, 0xf3, 0xd7, 0xfb , 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f,
0x9e, 0x81, 0xf3, 0xd7, 0xfb , 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f,
0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb , 0x54,
0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb , 0x54,
0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b,
0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b,
0x42, 0xfa, 0xc3, 0x4e , 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24,
0x42, 0xfa, 0xc3, 0x4e , 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24,
0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25 , 0x72, 0xf8,
0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25 , 0x72, 0xf8,
0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d,
0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d,
0x65, 0xb6, 0x92 , 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
0x65, 0xb6, 0x92 , 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84 , 0x90, 0xd8, 0xab,
0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84 , 0x90, 0xd8, 0xab,
0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3,
0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3,
0x45, 0x06 , 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1,
0x45, 0x06 , 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1,
0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b , 0x3a, 0x91, 0x11, 0x41,
0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b , 0x3a, 0x91, 0x11, 0x41,
0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6,
0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6,
0x73 , 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9,
0x73 , 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9,
0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e , 0x47, 0xf1, 0x1a, 0x71, 0x1d,
0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e , 0x47, 0xf1, 0x1a, 0x71, 0x1d,
0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b ,
0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b ,
0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0,
0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0,
0xfe, 0x78, 0xcd, 0x5a, 0xf4 , 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07,
0xfe, 0x78, 0xcd, 0x5a, 0xf4 , 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07,
0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f , 0x60,
0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f , 0x60,
0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f,
0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f,
0x93, 0xc9, 0x9c, 0xef , 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5,
0x93, 0xc9, 0x9c, 0xef , 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5,
0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61 , 0x17, 0x2b,
0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61 , 0x17, 0x2b,
0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55,
0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55,
0x21, 0x0c, 0x7d]
0x21, 0x0c, 0x7d]
def getSBoxValue(self,num):
def getSBoxValue(self,num):
"""Retrieves a given S-Box Value"""
"""Retrieves a given S-Box Value"""
return self.sbox[num]
return self.sbox[num]
def getSBoxInvert(self,num):
def getSBoxInvert(self,num):
"""Retrieves a given Inverted S-Box Value"""
"""Retrieves a given Inverted S-Box Value"""
return self.rsbox[num]
return self.rsbox[num]
def rotate(self, word):
def rotate(self, word):
""" Rijndael's key schedule rotate operation.
""" Rijndael's key schedule rotate operation.
Rotate a word eight bits to the left: eg, rotate(1d2c3a4f) == 2c3a4f1d
Rotate a word eight bits to the left: eg, rotate(1d2c3a4f) == 2c3a4f1d
Word is an char list of size 4 (32 bits overall).
Word is an char list of size 4 (32 bits overall).
"""
"""
return word[1:] + word[:1]
return word[1:] + word[:1]
# Rijndael Rcon
# Rijndael Rcon
Rcon = [0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36,
Rcon = [0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36,
0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97,
0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97,
0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66,
0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66,
0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,
0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,
0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61,
0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61,
0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc,
0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc,
0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a,
0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a,
0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d,
0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d,
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,
0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,
0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4,
0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4,
0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08,
0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2,
0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2,
0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74,
0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74,
0xe8, 0xcb ]
0xe8, 0xcb ]
def getRconValue(self, num):
def getRconValue(self, num):
"""Retrieves a given Rcon Value"""
"""Retrieves a given Rcon Value"""
return self.Rcon[num]
return self.Rcon[num]
def core(self, word, iteration):
def core(self, word, iteration):
"""Key schedule core."""
"""Key schedule core."""
# rotate the 32-bit word 8 bits to the left
# rotate the 32-bit word 8 bits to the left
word = self.rotate(word)
word = self.rotate(word)
# apply S-Box substitution on all 4 parts of the 32-bit word
# apply S-Box substitution on all 4 parts of the 32-bit word
for i in range(4):
for i in range(4):
word[i] = self.getSBoxValue(word[i])
word[i] = self.getSBoxValue(word[i])
# XOR the output of the rcon operation with i to the first part
# XOR the output of the rcon operation with i to the first part
# (leftmost) only
# (leftmost) only
word[0] = word[0] ^ self.getRconValue(iteration)
word[0] = word[0] ^ self.getRconValue(iteration)
return word
return word
def expandKey(self, key, size, expandedKeySize):
def expandKey(self, key, size, expandedKeySize):
"""Rijndael's key expansion.
"""Rijndael's key expansion.
Expands an 128,192,256 key into an 176,208,240 bytes key
Expands an 128,192,256 key into an 176,208,240 bytes key
expandedKey is a char list of large enough size,
expandedKey is a char list of large enough size,
key is the non-expanded key.
key is the non-expanded key.
"""
"""
# current expanded keySize, in bytes
# current expanded keySize, in bytes
currentSize = 0
currentSize = 0
rconIteration = 1
rconIteration = 1
expandedKey = [0] * expandedKeySize
expandedKey = [0] * expandedKeySize
# set the 16, 24, 32 bytes of the expanded key to the input key
# set the 16, 24, 32 bytes of the expanded key to the input key
for j in range(size):
for j in range(size):
expandedKey[j] = key[j]
expandedKey[j] = key[j]
currentSize += size
currentSize += size
while currentSize < expandedKeySize:
while currentSize < expandedKeySize:
# assign the previous 4 bytes to the temporary value t
# assign the previous 4 bytes to the temporary value t
t = expandedKey[currentSize-4:currentSize]
t = expandedKey[currentSize-4:currentSize]
# every 16,24,32 bytes we apply the core schedule to t
# every 16,24,32 bytes we apply the core schedule to t
# and increment rconIteration afterwards
# and increment rconIteration afterwards
if currentSize % size == 0:
if currentSize % size == 0:
t = self.core(t, rconIteration)
t = self.core(t, rconIteration)
rconIteration += 1
rconIteration += 1
# For 256-bit keys, we add an extra sbox to the calculation
# For 256-bit keys, we add an extra sbox to the calculation
if size == self.keySize["SIZE_256"] and ((currentSize % size) == 16):
if size == self.keySize["SIZE_256"] and ((currentSize % size) == 16):
for l in range(4): t[l] = self.getSBoxValue(t[l])
for l in range(4): t[l] = self.getSBoxValue(t[l])
# We XOR t with the four-byte block 16,24,32 bytes before the new
# We XOR t with the four-byte block 16,24,32 bytes before the new
# expanded key. This becomes the next four bytes in the expanded
# expanded key. This becomes the next four bytes in the expanded
# key.
# key.
for m in range(4):
for m in range(4):
expandedKey[currentSize] = expandedKey[currentSize - size] ^ \
expandedKey[currentSize] = expandedKey[currentSize - size] ^ \
t[m]
t[m]
currentSize += 1
currentSize += 1
return expandedKey
return expandedKey
def addRoundKey(self, state, roundKey):
def addRoundKey(self, state, roundKey):
"""Adds (XORs) the round key to the state."""
"""Adds (XORs) the round key to the state."""
for i in range(16):
for i in range(16):
state[i] ^= roundKey[i]
state[i] ^= roundKey[i]
return state
return state
def createRoundKey(self, expandedKey, roundKeyPointer):
def createRoundKey(self, expandedKey, roundKeyPointer):
"""Create a round key.
"""Create a round key.
Creates a round key from the given expanded key and the
Creates a round key from the given expanded key and the
position within the expanded key.
position within the expanded key.
"""
"""
roundKey = [0] * 16
roundKey = [0] * 16
for i in range(4):
for i in range(4):
for j in range(4):
for j in range(4):
roundKey[j*4+i] = expandedKey[roundKeyPointer + i*4 + j]
roundKey[j*4+i] = expandedKey[roundKeyPointer + i*4 + j]
return roundKey
return roundKey
def galois_multiplication(self, a, b):
def galois_multiplication(self, a, b):
"""Galois multiplication of 8 bit characters a and b."""
"""Galois multiplication of 8 bit characters a and b."""
p = 0
p = 0
for counter in range(8):
for counter in range(8):
if b & 1: p ^= a
if b & 1: p ^= a
hi_bit_set = a & 0x80
hi_bit_set = a & 0x80
a <<= 1
a <<= 1
# keep a 8 bit
# keep a 8 bit
a &= 0xFF
a &= 0xFF
if hi_bit_set:
if hi_bit_set:
a ^= 0x1b
a ^= 0x1b
b >>= 1
b >>= 1
return p
return p
#
#
# substitute all the values from the state with the value in the SBox
# substitute all the values from the state with the value in the SBox
# using the state value as index for the SBox
# using the state value as index for the SBox
#
#
def subBytes(self, state, isInv):
def subBytes(self, state, isInv):
if isInv: getter = self.getSBoxInvert
if isInv: getter = self.getSBoxInvert
else: getter = self.getSBoxValue
else: getter = self.getSBoxValue
for i in range(16): state[i] = getter(state[i])
for i in range(16): state[i] = getter(state[i])
return state
return state
# iterate over the 4 rows and call shiftRow() with that row
# iterate over the 4 rows and call shiftRow() with that row
def shiftRows(self, state, isInv):
def shiftRows(self, state, isInv):
for i in range(4):
for i in range(4):
state = self.shiftRow(state, i*4, i, isInv)
state = self.shiftRow(state, i*4, i, isInv)
return state
return state
# each iteration shifts the row to the left by 1
# each iteration shifts the row to the left by 1
def shiftRow(self, state, statePointer, nbr, isInv):
def shiftRow(self, state, statePointer, nbr, isInv):
for i in range(nbr):
for i in range(nbr):
if isInv:
if isInv:
state[statePointer:statePointer+4] = \
state[statePointer:statePointer+4] = \
state[statePointer+3:statePointer+4] + \
state[statePointer+3:statePointer+4] + \
state[statePointer:statePointer+3]
state[statePointer:statePointer+3]
else:
else:
state[statePointer:statePointer+4] = \
state[statePointer:statePointer+4] = \
state[statePointer+1:statePointer+4] + \
state[statePointer+1:statePointer+4] + \
state[statePointer:statePointer+1]
state[statePointer:statePointer+1]
return state
return state
# galois multiplication of the 4x4 matrix
# galois multiplication of the 4x4 matrix
def mixColumns(self, state, isInv):
def mixColumns(self, state, isInv):
# iterate over the 4 columns
# iterate over the 4 columns
for i in range(4):
for i in range(4):
# construct one column by slicing over the 4 rows
# construct one column by slicing over the 4 rows
column = state[i:i+16:4]
column = state[i:i+16:4]
# apply the mixColumn on one column
# apply the mixColumn on one column
column = self.mixColumn(column, isInv)
column = self.mixColumn(column, isInv)
# put the values back into the state
# put the values back into the state
state[i:i+16:4] = column
state[i:i+16:4] = column
return state
return state
# galois multiplication of 1 column of the 4x4 matrix
# galois multiplication of 1 column of the 4x4 matrix
def mixColumn(self, column, isInv):
def mixColumn(self, column, isInv):
if isInv: mult = [14, 9, 13, 11]
if isInv: mult = [14, 9, 13, 11]
else: mult = [2, 1, 1, 3]
else: mult = [2, 1, 1, 3]
cpy = list(column)
cpy = list(column)
g = self.galois_multiplication
g = self.galois_multiplication
column[0] = g(cpy[0], mult[0]) ^ g(cpy[3], mult[1]) ^ \
column[0] = g(cpy[0], mult[0]) ^ g(cpy[3], mult[1]) ^ \
g(cpy[2], mult[2]) ^ g(cpy[1], mult[3])
g(cpy[2], mult[2]) ^ g(cpy[1], mult[3])
column[1] = g(cpy[1], mult[0]) ^ g(cpy[0], mult[1]) ^ \
column[1] = g(cpy[1], mult[0]) ^ g(cpy[0], mult[1]) ^ \
g(cpy[3], mult[2]) ^ g(cpy[2], mult[3])
g(cpy[3], mult[2]) ^ g(cpy[2], mult[3])
column[2] = g(cpy[2], mult[0]) ^ g(cpy[1], mult[1]) ^ \
column[2] = g(cpy[2], mult[0]) ^ g(cpy[1], mult[1]) ^ \
g(cpy[0], mult[2]) ^ g(cpy[3], mult[3])
g(cpy[0], mult[2]) ^ g(cpy[3], mult[3])
column[3] = g(cpy[3], mult[0]) ^ g(cpy[2], mult[1]) ^ \
column[3] = g(cpy[3], mult[0]) ^ g(cpy[2], mult[1]) ^ \
g(cpy[1], mult[2]) ^ g(cpy[0], mult[3])
g(cpy[1], mult[2]) ^ g(cpy[0], mult[3])
return column
return column
# applies the 4 operations of the forward round in sequence
# applies the 4 operations of the forward round in sequence
def aes_round(self, state, roundKey):
def aes_round(self, state, roundKey):
state = self.subBytes(state, False)
state = self.subBytes(state, False)
state = self.shiftRows(state, False)
state = self.shiftRows(state, False)
state = self.mixColumns(state, False)
state = self.mixColumns(state, False)
state = self.addRoundKey(state, roundKey)
state = self.addRoundKey(state, roundKey)
return state
return state
# applies the 4 operations of the inverse round in sequence
# applies the 4 operations of the inverse round in sequence
def aes_invRound(self, state, roundKey):
def aes_invRound(self, state, roundKey):
state = self.shiftRows(state, True)
state = self.shiftRows(state, True)
state = self.subBytes(state, True)
state = self.subBytes(state, True)
state = self.addRoundKey(state, roundKey)
state = self.addRoundKey(state, roundKey)
state = self.mixColumns(state, True)
state = self.mixColumns(state, True)
return state
return state
# Perform the initial operations, the standard round, and the final
# Perform the initial operations, the standard round, and the final
# operations of the forward aes, creating a round key for each round
# operations of the forward aes, creating a round key for each round
def aes_main(self, state, expandedKey, nbrRounds):
def aes_main(self, state, expandedKey, nbrRounds):
state = self.addRoundKey(state, self.createRoundKey(expandedKey, 0))
state = self.addRoundKey(state, self.createRoundKey(expandedKey, 0))
i = 1
i = 1
while i < nbrRounds:
while i < nbrRounds:
state = self.aes_round(state,
state = self.aes_round(state,
self.createRoundKey(expandedKey, 16*i))
self.createRoundKey(expandedKey, 16*i))
i += 1
i += 1
state = self.subBytes(state, False)
state = self.subBytes(state, False)
state = self.shiftRows(state, False)
state = self.shiftRows(state, False)
state = self.addRoundKey(state,
state = self.addRoundKey(state,
self.createRoundKey(expandedKey, 16*nbrRounds))
self.createRoundKey(expandedKey, 16*nbrRounds))
return state
return state
# Perform the initial operations, the standard round, and the final
# Perform the initial operations, the standard round, and the final
# operations of the inverse aes, creating a round key for each round
# operations of the inverse aes, creating a round key for each round
def aes_invMain(self, state, expandedKey, nbrRounds):
def aes_invMain(self, state, expandedKey, nbrRounds):
state = self.addRoundKey(state,
state = self.addRoundKey(state,
self.createRoundKey(expandedKey, 16*nbrRounds))
self.createRoundKey(expandedKey, 16*nbrRounds))
i = nbrRounds - 1
i = nbrRounds - 1
while i > 0:
while i > 0:
state = self.aes_invRound(state,
state = self.aes_invRound(state,
self.createRoundKey(expandedKey, 16*i))
self.createRoundKey(expandedKey, 16*i))
i -= 1
i -= 1
state = self.shiftRows(state, True)
state = self.shiftRows(state, True)
state = self.subBytes(state, True)
state = self.subBytes(state, True)
state = self.addRoundKey(state, self.createRoundKey(expandedKey, 0))
state = self.addRoundKey(state, self.createRoundKey(expandedKey, 0))
return state
return state
# encrypts a 128 bit input block against the given key of size specified
# encrypts a 128 bit input block against the given key of size specified
def encrypt(self, iput, key, size):
def encrypt(self, iput, key, size):
output = [0] * 16
output = [0] * 16
# the number of rounds
# the number of rounds
nbrRounds = 0
nbrRounds = 0
# the 128 bit block to encode
# the 128 bit block to encode
block = [0] * 16
block = [0] * 16
# set the number of rounds
# set the number of rounds
if size == self.keySize["SIZE_128"]: nbrRounds = 10
if size == self.keySize["SIZE_128"]: nbrRounds = 10
elif size == self.keySize["SIZE_192"]: nbrRounds = 12
elif size == self.keySize["SIZE_192"]: nbrRounds = 12
elif size == self.keySize["SIZE_256"]: nbrRounds = 14
elif size == self.keySize["SIZE_256"]: nbrRounds = 14
else: return None
else: return None
# the expanded keySize
# the expanded keySize
expandedKeySize = 16*(nbrRounds+1)
expandedKeySize = 16*(nbrRounds+1)
# Set the block values, for the block:
# Set the block values, for the block:
# a0,0 a0,1 a0,2 a0,3
# a0,0 a0,1 a0,2 a0,3
# a1,0 a1,1 a1,2 a1,3
# a1,0 a1,1 a1,2 a1,3
# a2,0 a2,1 a2,2 a2,3
# a2,0 a2,1 a2,2 a2,3
# a3,0 a3,1 a3,2 a3,3
# a3,0 a3,1 a3,2 a3,3
# the mapping order is a0,0 a1,0 a2,0 a3,0 a0,1 a1,1 ... a2,3 a3,3
# the mapping order is a0,0 a1,0 a2,0 a3,0 a0,1 a1,1 ... a2,3 a3,3
#
#
# iterate over the columns
# iterate over the columns
for i in range(4):
for i in range(4):
# iterate over the rows
# iterate over the rows
for j in range(4):
for j in range(4):
block[(i+(j*4))] = iput[(i*4)+j]
block[(i+(j*4))] = iput[(i*4)+j]
# expand the key into an 176, 208, 240 bytes key
# expand the key into an 176, 208, 240 bytes key
# the expanded key
# the expanded key
expandedKey = self.expandKey(key, size, expandedKeySize)
expandedKey = self.expandKey(key, size, expandedKeySize)
# encrypt the block using the expandedKey
# encrypt the block using the expandedKey
block = self.aes_main(block, expandedKey, nbrRounds)
block = self.aes_main(block, expandedKey, nbrRounds)
# unmap the block again into the output
# unmap the block again into the output
for k in range(4):
for k in range(4):
# iterate over the rows
# iterate over the rows
for l in range(4):
for l in range(4):
output[(k*4)+l] = block[(k+(l*4))]
output[(k*4)+l] = block[(k+(l*4))]
return output
return output
# decrypts a 128 bit input block against the given key of size specified
# decrypts a 128 bit input block against the given key of size specified
def decrypt(self, iput, key, size):
def decrypt(self, iput, key, size):
output = [0] * 16
output = [0] * 16
# the number of rounds
# the number of rounds
nbrRounds = 0
nbrRounds = 0
# the 128 bit block to decode
# the 128 bit block to decode
block = [0] * 16
block = [0] * 16
# set the number of rounds
# set the number of rounds
if size == self.keySize["SIZE_128"]: nbrRounds = 10
if size == self.keySize["SIZE_128"]: nbrRounds = 10
elif size == self.keySize["SIZE_192"]: nbrRounds = 12
elif size == self.keySize["SIZE_192"]: nbrRounds = 12
elif size == self.keySize["SIZE_256"]: nbrRounds = 14
elif size == self.keySize["SIZE_256"]: nbrRounds = 14
else: return None
else: return None
# the expanded keySize
# the expanded keySize
expandedKeySize = 16*(nbrRounds+1)
expandedKeySize = 16*(nbrRounds+1)
# Set the block values, for the block:
# Set the block values, for the block:
# a0,0 a0,1 a0,2 a0,3
# a0,0 a0,1 a0,2 a0,3
# a1,0 a1,1 a1,2 a1,3
# a1,0 a1,1 a1,2 a1,3
# a2,0 a2,1 a2,2 a2,3
# a2,0 a2,1 a2,2 a2,3
# a3,0 a3,1 a3,2 a3,3
# a3,0 a3,1 a3,2 a3,3
# the mapping order is a0,0 a1,0 a2,0 a3,0 a0,1 a1,1 ... a2,3 a3,3
# the mapping order is a0,0 a1,0 a2,0 a3,0 a0,1 a1,1 ... a2,3 a3,3
# iterate over the columns
# iterate over the columns
for i in range(4):
for i in range(4):
# iterate over the rows
# iterate over the rows
for j in range(4):
for j in range(4):
block[(i+(j*4))] = iput[(i*4)+j]
block[(i+(j*4))] = iput[(i*4)+j]
# expand the key into an 176, 208, 240 bytes key
# expand the key into an 176, 208, 240 bytes key
expandedKey = self.expandKey(key, size, expandedKeySize)
expandedKey = self.expandKey(key, size, expandedKeySize)
# decrypt the block using the expandedKey
# decrypt the block using the expandedKey
block = self.aes_invMain(block, expandedKey, nbrRounds)
block = self.aes_invMain(block, expandedKey, nbrRounds)
# unmap the block again into the output
# unmap the block again into the output
for k in range(4):
for k in range(4):
# iterate over the rows
# iterate over the rows
for l in range(4):
for l in range(4):
output[(k*4)+l] = block[(k+(l*4))]
output[(k*4)+l] = block[(k+(l*4))]
return output
return output
class AESModeOfOperation(object):
class AESModeOfOperation(object):
aes = AES()
aes = AES()
# structure of supported modes of operation
# structure of supported modes of operation
modeOfOperation = dict(OFB=0, CFB=1, CBC=2)
modeOfOperation = dict(OFB=0, CFB=1, CBC=2)
# converts a 16 character string into a number array
# converts a 16 character string into a number array
def convertString(self, string, start, end, mode):
def convertString(self, string, start, end, mode):
if end - start > 16: end = start + 16
if end - start > 16: end = start + 16
if mode == self.modeOfOperation["CBC"]: ar = [0] * 16
if mode == self.modeOfOperation["CBC"]: ar = [0] * 16
else: ar = []
else: ar = []
i = start
i = start
j = 0
j = 0
while len(ar) < end - start:
while len(ar) < end - start:
ar.append(0)
ar.append(0)
while i < end:
while i < end:
ar[j] = ord(string[i])
ar[j] = ord(string[i])
j += 1
j += 1
i += 1
i += 1
return ar
return ar
# Mode of Operation Encryption
# Mode of Operation Encryption
# stringIn - Input String
# stringIn - Input String
# mode - mode of type modeOfOperation
# mode - mode of type modeOfOperation
# hexKey - a hex key of the bit length size
# hexKey - a hex key of the bit length size
# size - the bit length of the key
# size - the bit length of the key
# hexIV - the 128 bit hex Initilization Vector
# hexIV - the 128 bit hex Initilization Vector
def encrypt(self, stringIn, mode, key, size, IV):
def encrypt(self, stringIn, mode, key, size, IV):
if len(key) % size:
if len(key) % size:
return None
return None
if len(IV) % 16:
if len(IV) % 16:
return None
return None
# the AES input/output
# the AES input/output
plaintext = []
plaintext = []
iput = [0] * 16
iput = [0] * 16
output = []
output = []
ciphertext = [0] * 16
ciphertext = [0] * 16
# the output cipher string
# the output cipher string
cipherOut = []
cipherOut = []
# char firstRound
# char firstRound
firstRound = True
firstRound = True
if stringIn != None:
if stringIn != None:
for j in range(int(math.ceil(float(len(stringIn))/16))):
for j in range(int(math.ceil(float(len(stringIn))/16))):
start = j*16
start = j*16
end = j*16+16
end = j*16+16
if end > len(stringIn):
if end > len(stringIn):
end = len(stringIn)
end = len(stringIn)
plaintext = self.convertString(stringIn, start, end, mode)
plaintext = self.convertString(stringIn, start, end, mode)
# print 'PT@%s:%s' % (j, plaintext)
# print 'PT@%s:%s' % (j, plaintext)
if mode == self.modeOfOperation["CFB"]:
if mode == self.modeOfOperation["CFB"]:
if firstRound:
if firstRound:
output = self.aes.encrypt(IV, key, size)
output = self.aes.encrypt(IV, key, size)
firstRound = False
firstRound = False
else:
else:
output = self.aes.encrypt(iput, key, size)
output = self.aes.encrypt(iput, key, size)
for i in range(16):
for i in range(16):
if len(plaintext)-1 < i:
if len(plaintext)-1 < i:
ciphertext[i] = 0 ^ output[i]
ciphertext[i] = 0 ^ output[i]
elif len(output)-1 < i:
elif len(output)-1 < i:
ciphertext[i] = plaintext[i] ^ 0
ciphertext[i] = plaintext[i] ^ 0
elif len(plaintext)-1 < i and len(output) < i:
elif len(plaintext)-1 < i and len(output) < i:
ciphertext[i] = 0 ^ 0
ciphertext[i] = 0 ^ 0
else:
else:
ciphertext[i] = plaintext[i] ^ output[i]
ciphertext[i] = plaintext[i] ^ output[i]
for k in range(end-start):
for k in range(end-start):
cipherOut.append(ciphertext[k])
cipherOut.append(ciphertext[k])
iput = ciphertext
iput = ciphertext
elif mode == self.modeOfOperation["OFB"]:
elif mode == self.modeOfOperation["OFB"]:
if firstRound:
if firstRound:
output = self.aes.encrypt(IV, key, size)
output = self.aes.encrypt(IV, key, size)
firstRound = False
firstRound = False
else:
else:
output = self.aes.encrypt(iput, key, size)
output = self.aes.encrypt(iput, key, size)
for i in range(16):
for i in range(16):
if len(plaintext)-1 < i:
if len(plaintext)-1 < i:
ciphertext[i] = 0 ^ output[i]
ciphertext[i] = 0 ^ output[i]
elif len(output)-1 < i:
elif len(output)-1 < i:
ciphertext[i] = plaintext[i] ^ 0
ciphertext[i] = plaintext[i] ^ 0
elif len(plaintext)-1 < i and len(output) < i:
elif len(plaintext)-1 < i and len(output) < i:
ciphertext[i] = 0 ^ 0
ciphertext[i] = 0 ^ 0
else:
else:
ciphertext[i] = plaintext[i] ^ output[i]
ciphertext[i] = plaintext[i] ^ output[i]
for k in range(end-start):
for k in range(end-start):
cipherOut.append(ciphertext[k])
cipherOut.append(ciphertext[k])
iput = output
iput = output
elif mode == self.modeOfOperation["CBC"]:
elif mode == self.modeOfOperation["CBC"]:
for i in range(16):
for i in range(16):
if firstRound:
if firstRound:
iput[i] = plaintext[i] ^ IV[i]
iput[i] = plaintext[i] ^ IV[i]
else:
else:
iput[i] = plaintext[i] ^ ciphertext[i]
iput[i] = plaintext[i] ^ ciphertext[i]
# print 'IP@%s:%s' % (j, iput)
# print 'IP@%s:%s' % (j, iput)
firstRound = False
firstRound = False
ciphertext = self.aes.encrypt(iput, key, size)
ciphertext = self.aes.encrypt(iput, key, size)
# always 16 bytes because of the padding for CBC
# always 16 bytes because of the padding for CBC
for k in range(16):
for k in range(16):
cipherOut.append(ciphertext[k])
cipherOut.append(ciphertext[k])
return mode, len(stringIn), cipherOut
return mode, len(stringIn), cipherOut
# Mode of Operation Decryption
# Mode of Operation Decryption
# cipherIn - Encrypted String
# cipherIn - Encrypted String
# originalsize - The unencrypted string length - required for CBC
# originalsize - The unencrypted string length - required for CBC
# mode - mode of type modeOfOperation
# mode - mode of type modeOfOperation
# key - a number array of the bit length size
# key - a number array of the bit length size
# size - the bit length of the key
# size - the bit length of the key
# IV - the 128 bit number array Initilization Vector
# IV - the 128 bit number array Initilization Vector
def decrypt(self, cipherIn, originalsize, mode, key, size, IV):
def decrypt(self, cipherIn, originalsize, mode, key, size, IV):
# cipherIn = unescCtrlChars(cipherIn)
# cipherIn = unescCtrlChars(cipherIn)
if len(key) % size:
if len(key) % size:
return None
return None
if len(IV) % 16:
if len(IV) % 16:
return None
return None
# the AES input/output
# the AES input/output
ciphertext = []
ciphertext = []
iput = []
iput = []
output = []
output = []
plaintext = [0] * 16
plaintext = [0] * 16
# the output plain text string
# the output plain text string
stringOut = ''
stringOut = ''
# char firstRound
# char firstRound
firstRound = True
firstRound = True
if cipherIn != None:
if cipherIn != None:
for j in range(int(math.ceil(float(len(cipherIn))/16))):
for j in range(int(math.ceil(float(len(cipherIn))/16))):
start = j*16
start = j*16
end = j*16+16
end = j*16+16
if j*16+16 > len(cipherIn):
if j*16+16 > len(cipherIn):
end = len(cipherIn)
end = len(cipherIn)
ciphertext = cipherIn[start:end]
ciphertext = cipherIn[start:end]
if mode == self.modeOfOperation["CFB"]:
if mode == self.modeOfOperation["CFB"]:
if firstRound:
if firstRound:
output = self.aes.encrypt(IV, key, size)
output = self.aes.encrypt(IV, key, size)
firstRound = False
firstRound = False
else:
else:
output = self.aes.encrypt(iput, key, size)
output = self.aes.encrypt(iput, key, size)
for i in range(16):
for i in range(16):
if len(output)-1 < i:
if len(output)-1 < i:
plaintext[i] = 0 ^ ciphertext[i]
plaintext[i] = 0 ^ ciphertext[i]
elif len(ciphertext)-1 < i:
elif len(ciphertext)-1 < i:
plaintext[i] = output[i] ^ 0
plaintext[i] = output[i] ^ 0
elif len(output)-1 < i and len(ciphertext) < i:
elif len(output)-1 < i and len(ciphertext) < i:
plaintext[i] = 0 ^ 0
plaintext[i] = 0 ^ 0
else:
else:
plaintext[i] = output[i] ^ ciphertext[i]
plaintext[i] = output[i] ^ ciphertext[i]
for k in range(end-start):
for k in range(end-start):
stringOut += chr(plaintext[k])
stringOut += chr(plaintext[k])
iput = ciphertext
iput = ciphertext
elif mode == self.modeOfOperation["OFB"]:
elif mode == self.modeOfOperation["OFB"]:
if firstRound:
if firstRound:
output = self.aes.encrypt(IV, key, size)
output = self.aes.encrypt(IV, key, size)
firstRound = False
firstRound = False
else:
else:
output = self.aes.encrypt(iput, key, size)
output = self.aes.encrypt(iput, key, size)
for i in range(16):
for i in range(16):
if len(output)-1 < i:
if len(output)-1 < i:
plaintext[i] = 0 ^ ciphertext[i]
plaintext[i] = 0 ^ ciphertext[i]
elif len(ciphertext)-1 < i:
elif len(ciphertext)-1 < i:
plaintext[i] = output[i] ^ 0
plaintext[i] = output[i] ^ 0
elif len(output)-1 < i and len(ciphertext) < i:
elif len(output)-1 < i and len(ciphertext) < i:
plaintext[i] = 0 ^ 0
plaintext[i] = 0 ^ 0
else:
else:
plaintext[i] = output[i] ^ ciphertext[i]
plaintext[i] = output[i] ^ ciphertext[i]
for k in range(end-start):
for k in range(end-start):
stringOut += chr(plaintext[k])
stringOut += chr(plaintext[k])
iput = output
iput = output
elif mode == self.modeOfOperation["CBC"]:
elif mode == self.modeOfOperation["CBC"]:
output = self.aes.decrypt(ciphertext, key, size)
output = self.aes.decrypt(ciphertext, key, size)
for i in range(16):
for i in range(16):
if firstRound:
if firstRound:
plaintext[i] = IV[i] ^ output[i]
plaintext[i] = IV[i] ^ output[i]
else:
else:
plaintext[i] = iput[i] ^ output[i]
plaintext[i] = iput[i] ^ output[i]
firstRound = False
firstRound = False
if originalsize is not None and originalsize < end:
if originalsize is not None and originalsize < end:
for k in range(originalsize-start):
for k in range(originalsize-start):
stringOut += chr(plaintext[k])
stringOut += chr(plaintext[k])
else:
else:
for k in range(end-start):
for k in range(end-start):
stringOut += chr(plaintext[k])
stringOut += chr(plaintext[k])
iput = ciphertext
iput = ciphertext
return stringOut
return stringOut
######################
######################
# end of aes.py code #
# end of aes.py code #
######################
######################
###################################
###################################
# pywallet crypter implementation #
# pywallet crypter implementation #
###################################
###################################
crypter = None
crypter = None
try:
try:
from Crypto.Cipher import AES
from Crypto.Cipher import AES
crypter = 'pycrypto'
crypter = 'pycrypto'
except:
except:
pass
pass
class Crypter_pycrypto( object ):
class Crypter_pycrypto( object ):
def SetKeyFromPassphrase(self, vKeyData, vSalt, nDerivIterations, nDerivationMethod):
def SetKeyFromPassphrase(self, vKeyData, vSalt, nDerivIterations, nDerivationMethod):
if nDerivationMethod != 0:
if nDerivationMethod != 0:
return 0
return 0
data = vKeyData + vSalt
data = vKeyData + vSalt
for i in xrange(nDerivIterations):
for i in xrange(nDerivIterations):
data = hashlib.sha512(data).digest()
data = hashlib.sha512(data).digest()
self.SetKey(data[0:32])
self.SetKey(data[0:32])
self.SetIV(data[32:32+16])
self.SetIV(data[32:32+16])
return len(data)
return len(data)
def SetKey(self, key):
def SetKey(self, key):
self.chKey = key
self.chKey = key
def SetIV(self, iv):
def SetIV(self, iv):
self.chIV = iv[0:16]
self.chIV = iv[0:16]
def Encrypt(self, data):
def Encrypt(self, data):
return AES.new(self.chKey,AES.MODE_CBC,self.chIV).encrypt(append_PKCS7_padding(data))
return AES.new(self.chKey,AES.MODE_CBC,self.chIV).encrypt(append_PKCS7_padding(data))
def Decrypt(self, data):
def Decrypt(self, data):
return AES.new(self.chKey,AES.MODE_CBC,self.chIV).decrypt(data)[0:32]
return AES.new(self.chKey,AES.MODE_CBC,self.chIV).decrypt(data)[0:32]
try:
try:
if not crypter:
if not crypter:
import ctypes
import ctypes
import ctypes.util
import ctypes.util
ssl = ctypes.cdll.LoadLibrary (ctypes.util.find_library ('ssl') or 'libeay32')
ssl = ctypes.cdll.LoadLibrary (ctypes.util.find_library ('ssl') or 'libeay32')
crypter = 'ssl'
crypter = 'ssl'
except:
except:
pass
pass
class Crypter_ssl(object):
class Crypter_ssl(object):
def __init__(self):
def __init__(self):
self.chKey = ctypes.create_string_buffer (32)
self.chKey = ctypes.create_string_buffer (32)
self.chIV = ctypes.create_string_buffer (16)
self.chIV = ctypes.create_string_buffer (16)
def SetKeyFromPassphrase(self, vKeyData, vSalt, nDerivIterations, nDerivationMethod):
def SetKeyFromPassphrase(self, vKeyData, vSalt, nDerivIterations, nDerivationMethod):
if nDerivationMethod != 0:
if nDerivationMethod != 0:
return 0
return 0
strKeyData = ctypes.create_string_buffer (vKeyData)
strKeyData = ctypes.create_string_buffer (vKeyData)
chSalt = ctypes.create_str
chSalt = ctypes.create_str