class PEA(): def __init__(self, key): self.key_gen = KeyGenerator(key) self.matrix_permute = MatrixPermute(self.key_gen.seed) self.subkeys = self.key_gen.get_subkeys() def encrypt(self, bits, decrypt=False): ''' bits: list of 0s and 1s ''' if len(bits) != 256: raise Exception('Length of bits must be 256') b1, b2, b3, b4 = bits[:64], bits[64:128], bits[128:192], bits[192:256] m1 = self.matrix_permute.permute(b1) m2 = self.matrix_permute.permute(b2) m3 = self.matrix_permute.permute(b3) m4 = self.matrix_permute.permute(b4) subkeys_1 = self.subkeys[:16] f1 = Feistel(m1, m2, subkeys_1) if decrypt: f1.decipher() else: f1.encipher() subkeys_2 = self.subkeys[16:32] f2 = Feistel(m3, m4, subkeys_2) if decrypt: f2.decipher() else: f2.encipher() m1 = self.matrix_permute.permute(f1.lmatrix, True) m2 = self.matrix_permute.permute(f1.rmatrix, True) m3 = self.matrix_permute.permute(f2.lmatrix, True) m4 = self.matrix_permute.permute(f2.rmatrix, True) return m1.tolist() + m2.tolist() + m3.tolist() + m4.tolist()
self.lmatrix = self.round_function(self.rmatrix, self.lmatrix, inv_subkeys[i]) self.rmatrix = temp def xor_bit(bits1, bits2): bits1_str = ''.join([str(x) for x in bits1]) bits2_str = ''.join([str(x) for x in bits2]) res_xor = '{:064b}'.format(int(bits1_str, 2) ^ int(bits2_str, 2)) return np.asarray([int(x) for x in res_xor]) if __name__ == '__main__': import random k = KeyGenerator('hello adelle') matrix_permute = MatrixPermute(k.seed) m0 = [random.randint(0, 1) for i in range(64)] m0 = matrix_permute.permute(m0) m1 = [random.randint(0, 1) for i in range(64)] m1 = matrix_permute.permute(m1) f = Feistel(m0, m1, k.get_subkeys()[:16]) subkey = f.reduce_subkey(f.rmatrix, f.subkeys[0]) print(subkey) print(xor_bit(subkey, [0] * 64)) f.encipher() f.decipher() print(f.lmatrix.tolist() == m0.tolist()) print(f.rmatrix.tolist() == m1.tolist())