In [1]:
import basic
In [3]:
print basic.ascii2hexstring("YELLOW SUBMARINE")
In [39]:
def pad(s,blocklength):
num=blocklength-(len(s)%blocklength)
if len(s)%blocklength==0:
return s
else:
return s + "".join([chr(num)]*(num))
In [8]:
print basic.ascii2hexstring(chr(0))
In [27]:
print basic.ascii2hexstring(pad("YELLOW SUBMARINE",4))
print pad("YELLOW SUBMARINE",20)
In [2]:
print basic.splitblocks("YELLOW SUBMARINE",8)
In [1]:
from basic import *
In [2]:
def decryptCBCAES(k,s,iv):
plaintext=""
blocks=splitblocks(s,16)
for block in blocks:
temp=decryptECBAES(k,block)
plaintext+=xorstrings(temp,iv)
iv=block
return plaintext
In [3]:
ct=""
f=open("10.txt","r")
for line in f:
ct+=line.strip()
f.close()
ct=b642ascii(ct)
In [4]:
print decryptCBCAES("YELLOW SUBMARINE", ct, "".join([chr(0)]*16))
In [5]:
news=decryptCBCAES("YELLOW SUBMARINE", ct, "".join([chr(0)]*16))
In [15]:
def encryptCBCAES(k,s,iv):
ctext=""
blocks=splitblocks(s,16)
for block in blocks:
t=xorstrings(block,iv)
temp=encryptECBAES(k,t)
ctext+=temp
iv=temp
return ctext
In [16]:
crypt=encryptCBCAES("YELLOW SUBMARINE", news, "".join([chr(0)]*16))
In [17]:
ct==crypt
Out[17]:
In [11]:
print ascii2hexstring(ct[:32])
print ascii2hexstring(crypt[:32])
In [14]:
print news[:32]
In [20]:
print splitblocks(ascii2hexstring(encryptCBCAES("YELLOW SUBMARINE","".join([chr(0)]*64) , "".join([chr(0)]*16))),32)
In [21]:
print splitblocks(ascii2hexstring(encryptECBAES("YELLOW SUBMARINE","".join([chr(0)]*64) )),32)
In [22]:
from random import randint
In [24]:
def randomkey(keysize):
return "".join([chr(randint(0,255)) for x in xrange(keysize)])
In [25]:
x=randomkey(16)
In [26]:
print len(x)
In [27]:
print ascii2hexstring(x)
In [34]:
print randint(0,1)
In [52]:
def randomencrypt(s):
key=randomkey(16)
cbefore=randint(5,10)
cafter=randint(5,10)
news=randomkey(cbefore)+s+randomkey(cafter)
news=pad(news,16)
x=randint(0,1)
if x==0:
out=encryptECBAES(key,news)
print "Chose ECB"
else:
out=encryptCBCAES(key,news , randomkey(16))
print "Chose CBC"
return out
In [51]:
print splitblocks(ascii2hexstring(randomencrypt("".join([chr(0)]*64))),32)
In [53]:
def ECBorCBCoracle(blackbox):
lenblock=16
samecount=0
c=blackbox("".join([chr(0)]*128))
for i in xrange(len(c)/lenblock):
for j in xrange(i+1,(len(c)/lenblock)):
if c[i*lenblock:(i+1)*lenblock] == c[j*lenblock:(j+1)*lenblock]:
samecount+=1
if samecount>0:
return "ECB"
else:
return "CBC"
In [ ]:
lenblock=32
simd={}
for z in xrange(len(cps)):
c=cps[z]
count=0
for i in xrange(len(c)/lenblock):
for j in xrange(i+1,(len(c)/lenblock)):
if c[i*lenblock:(i+1)*lenblock] == c[j*lenblock:(j+1)*lenblock]:
count+=1
In [61]:
print ECBorCBCoracle(randomencrypt)
In [76]:
def repeatECB(key,s):
appends=b642ascii("Um9sbGluJyBpbiBteSA1LjAKV2l0aCBteSByYWctdG9wIGRvd24gc28gbXkgaGFpciBjYW4gYmxvdwpUaGUgZ2lybGllcyBvbiBzdGFuZGJ5IHdhdmluZyBqdXN0IHRvIHNheSBoaQpEaWQgeW91IHN0b3A/IE5vLCBJIGp1c3QgZHJvdmUgYnkK")
s=s+appends
s=pad(s,16)
out=encryptECBAES(key,s)
return out
In [67]:
In [65]:
globalkey=randomkey(16)
In [85]:
print ascii2hexstring(repeatECB(globalkey,"A"*16))
In [100]:
def findblocksize(blackbox,key, limit):
prevval=""
for bs in xrange(2,limit):
ct=blackbox(key,"A"*bs)
if ct[:bs-1]==prevval:
return bs-1
else:
prevval=ct[:bs]
return None
findblocksize(repeatECB, globalkey,256)
Out[100]:
In [101]:
def newECBorCBCoracle(key,lenblock,blackbox):
samecount=0
c=blackbox(key,"".join([chr(0)]*128))
for i in xrange(len(c)/lenblock):
for j in xrange(i+1,(len(c)/lenblock)):
if c[i*lenblock:(i+1)*lenblock] == c[j*lenblock:(j+1)*lenblock]:
samecount+=1
if samecount>0:
return "ECB"
else:
return "CBC"
In [89]:
print len("231ef99bbde7af1217b1fe24e4bfd32e")
In [102]:
newECBorCBCoracle(globalkey,16,repeatECB)
Out[102]:
In [103]:
onebyteshort=repeatECB(globalkey, "A"*15)
In [104]:
print onebyteshort
In [179]:
def createdict(blackbox, key,blocksize,curblock=0,byte=1,knownletters=[]):
d={}
z=curblock*blocksize
for a in xrange(0,128):
d[blackbox(key,("A"*((blocksize-byte)))+"".join(knownletters)+chr(a))[z:z+blocksize]]=chr(a)
#print ("A"*((blocksize-byte)))+"".join(knownletters)+chr(a)
return d
In [111]:
d=createdict(repeatECB, globalkey,16)
In [113]:
d[onebyteshort[:16]]
Out[113]:
In [119]:
print len(repeatECB(globalkey,""))
In [116]:
print len(onebyteshort)
In [187]:
def padoracle(blackbox,blocksize,totalbytes,key):
outs=[]
knownletters=[]
for b in xrange(totalbytes/blocksize):
o=""
for byte in xrange(1,blocksize+1):
onebyteshort=blackbox(key, "A"*((blocksize-byte)))
d=createdict(blackbox,key,blocksize,curblock=b,byte=byte,knownletters=knownletters)
#print d
try:
knownletters.append(d[onebyteshort[b*blocksize:(b+1)*blocksize]])
o+=d[onebyteshort[b*blocksize:(b+1)*blocksize]]
except:
pass
# print o, b
outs.append(o)
#print outs,b
return "".join(outs)
In [199]:
def unpad(s):
n=s[-1:]
i=ord(n)
if all(map(lambda x: x==n, s[-i:])):
return s[:-i]
else:
return s
In [189]:
print len(padoracle(repeatECB,16,144,globalkey))
In [160]:
print len("AAAAAAAAAAAAAAARollin' in my 5}")
In [161]:
print len("AAAAAAAAAAAAAAA")
In [163]:
print len("Rollin' in my 5")
In [175]:
print len("AAAAAAAAAAAAAARollin' in my 5.0}")
In [190]:
print len(b642ascii("Um9sbGluJyBpbiBteSA1LjAKV2l0aCBteSByYWctdG9wIGRvd24gc28gbXkgaGFpciBjYW4gYmxvdwpUaGUgZ2lybGllcyBvbiBzdGFuZGJ5IHdhdmluZyBqdXN0IHRvIHNheSBoaQpEaWQgeW91IHN0b3A/IE5vLCBJIGp1c3QgZHJvdmUgYnkK"))
In [197]:
print ascii2hexstring(chr(3))
print ord(chr(3))
In [200]:
unpad("Test")
Out[200]:
In [201]:
out=padoracle(repeatECB,16,144,globalkey)
In [203]:
print ascii2hexstring(out)
In [204]:
print ascii2hexstring(unpad(out))
In [205]:
print unpad(out)==b642ascii("Um9sbGluJyBpbiBteSA1LjAKV2l0aCBteSByYWctdG9wIGRvd24gc28gbXkgaGFpciBjYW4gYmxvdwpUaGUgZ2lybGllcyBvbiBzdGFuZGJ5IHdhdmluZyBqdXN0IHRvIHNheSBoaQpEaWQgeW91IHN0b3A/IE5vLCBJIGp1c3QgZHJvdmUgYnkK")
In [ ]: