按时间表python进行排列

时间:2013-02-06 02:21:29

标签: python-2.7 permutation des

我正在尝试在python中实现用于学习目的的简化DES,但是我无法根据“时间表”找出如何进行排列的方法。基本上,我有一个具有适当排列的元组,我需要移位到正确的位置。

例如,使用密钥:

K = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001

将第57位移至第一位,第49位移至第二位,等等......

K + = 1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111

当前代码:

def keyGen(key):
    PC1table = (57, 49, 41, 33, 25, 17,  9,
                 1, 58, 50, 42, 34, 26, 18,
                10,  2, 59, 51, 43, 35, 27,
                19, 11,  3, 60, 52, 44, 36,
                63, 55, 47, 39, 31, 23, 15,
                 7, 62, 54, 46, 38, 30, 22,
                14,  6, 61, 53, 45, 37, 29,
                21, 13,  5, 28, 20, 12,  4)

    keyBinary = bin(int(key, 16))[2:].zfill(64)
    print keyBinary
    permute(PC1table, keyBinary)

def permute(permutation, permuteInput):
    elements = list(enumerate(permutation))
    for bit in permuteInput:
         ***magic bitshifting goes here***


keyGen("133457799BBCDFF1")

我认为可以工作的逻辑是枚举排列的元组,并且对于我的旧密钥的每一位,查看枚举以找到对应该位的索引,并且移位适当的次数,但是我只是无法弄清楚如何去做这件事。可能是我从错误的角度处理问题,但任何指导都会非常感激!

1 个答案:

答案 0 :(得分:0)

好的,我最终找到了一种方法来完成这项工作,虽然这可能不是最有效的方法......

在调用函数之前,将二进制数转换为列表:

keyBinary = bin(int(key, 16))[2:].zfill(64)
keyBinary = [int(i) for i in keyBinary]

Kplus = permute(PC1table, keyBinary)

def permute(mapping, permuteInput):
    permuteOutput = []

    for i in range(len(mapping)):
        permuteOutput.append(permuteInput[mapping[i % 56] - 1])

    return permuteOutput

如果有人有更好的解决方法,我很乐意看到你的解决方案!