def random_involution(n): print 'WARNING: too low number of fixed points! not a uniform distribution' pairs = range(2**n) shuffle(pairs) s = [0] * 2**n while pairs: if len(pairs) == 1 or randint(1, len(pairs)) == 1: a = b = pairs.pop() else: a, b = pairs.pop(), pairs.pop() s[a] = b s[b] = a return s
def ddt_max_estimation(self, iter=100, limit=None): mx = 0 for i in xrange(iter): dx = randint(1, self.insize - 1) cnt = 0 dys = Counter() for x in xrange(self.insize): dy = self[x] ^ self[x ^ dx] dys[dy] += 1 if limit is not None and dys[dy] > limit: return dys[dy] mx = max(mx, dys[dy]) return mx
def random_sbox_of_degree(m, n, d, h**o=False, force_all_maxterms=False): anfs = [list() for i in xrange(n)] for out_bit in xrange(n): mindeg = 1 if h**o else 0 for deg in xrange(mindeg, d + 1): for mask in hamming_masks(m, deg): if randint(0, 1) == 1 or (force_all_maxterms and deg == d): anfs[out_bit].append(mask) res = [] for x in xrange(2**m): y = 0 for e, anf in enumerate(anfs): e = n - 1 - e val = 0 for mask in anf: val ^= ((mask & x) == mask) val &= 1 y |= val << e res.append(y) return res
def random_affine(*args): lin = random_linear(*args) xor = randint(0, max(lin)) return [y ^ xor for y in lin]
def random_affine_permutation(n): xor = randint(0, 2**n-1) return [y ^ xor for y in from_matrix(random_invertible_matrix(n))]
def random_Boolean_function_of_degree(m, d): anf = [randint(0, 1) if hw(x) <= d else 0 for x in xrange(2**m)] return gen.SBox2(anf, n=1).mobius()
def random_function(m, n=None, h**o=False): n = n or m res = [randint(0, 2**n - 1) for i in xrange(2**m)] if h**o: res[0] = 0 return res
def randomize_xor(self): a = randint(0, self.insize - 1) b = randint(0, self.outsize - 1) return self.xor(a, b)