def createHashTablesecond(self): """ eliminate as many keys as possible, brute force the remaining ones by calling tryencryption() """ print "Testing..." nbTried = 0 self.temp = CMEA() print "K4" for k4 in xrange(128): print k4 for k5 in xrange(256): for (k6,k7) in self.possible67: tpp = [self.calcpp(a,ta,k4,k5,k6,k7) for (a,ta) in self.tuples] if [] in tpp: continue for (a,b,c,d) in [(a,b,c,d) for a in tpp[0] for b in tpp[1] for c in tpp[2] for d in tpp[3]]: m = ((a-d)%256,(b-d)%256, (c-d)%256) m = m[0]*256**2 + m[1]*256+m[2] if m in self.startmap: for k in self.startmap[m]: nbTried = nbTried + 1 key = k[:3] key.append((a-k[3])%256) key.extend([k4,k5,k6,k7]) if self.trialencryption(key): print "key found: ",key print "this key may not be the exact same one, but it is equivalent..." print "keys tried: ", nbTried return True
def __init__(self): nbplaintext = 80 self.p0 = [ [ True for i in range(256) ] for j in range(256) ] for i in range(256): for j in range(256): if(not ((j-i) % 256) in cavetable): self.p0[i][j] = False self.CVI = CVInverse() self.p = None self.c = CMEA() self.texts = self.createPlaintexts(nbplaintext, self.c)
# if one of the value if knwon (because the cave table invalidate one of the option) we can deduce the other value posj = [tj, tj + 1] posz = [(tj - c) % 256, (tj + 1 - c) % 256] posj = [k for k in posj if (k - j) % 256 in cavetable] posz = [k for k in posz if (k - z) % 256 in cavetable] if len(posj) == 1: self.known[j] = posj[0] if len(posz) == 1: self.known[z] = posz[0] return compteur if __name__ == '__main__': d = Decrypter() d.setCrypter(CMEA()) d.c.blocksize = 3 d.c.createRandomKey() possibilities = d.findTzero() print "number of possible values for t0:", len(possibilities) for p in possibilities: # checks if the value for t0 is correct t = d.findPossibleOthers(p) if t != []: break d.getallconstraints(t[0][0]) for i in range(10): print "number of Tbox output known at iteration ", i, " :", len( d.known)