示例#1
0
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()
示例#2
0
            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())