2013-02-06 53 views
0

我試圖在python中爲學習目的實現簡化的DES,但我很難搞清楚如何根據「時間表」進行排列。本質上,我有一個適當的排列組合,我需要位移到正確的位置。按計劃排列python

例如,使用鍵:

K = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001

請問57st位移動到第一個位點,第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") 

我認爲會工作的邏輯是列舉排列的元組,並且對於我的舊密鑰的每一位,查看枚舉以查找與該位對應的索引,並移位適當的次數,但我無法弄清楚如何去做這件事。這可能是我從錯誤的角度接近問題,但任何指導將不勝感激!

+0

當你說「會把第57位移到第一位點」時,你說你創建了一個新的二進制數,它的位來自初始值的權利? – Ketouem

+0

Ketouem,這是正確的。使用原始密鑰K並將其排除在「PC1Table」上產生新密鑰K +, K + = 1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111 – ph34r

回答

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 

如果有人有更好的解決方法,我很樂意看到您的解決方案!