0

Python で学習目的で簡略化された DES を実装しようとしていますが、「スケジュール」に基づいて順列を実行する方法がわかりません。基本的に、適切な順列を持つタプルがあり、正しい位置にビット シフトする必要があります。

たとえば、キーを使用すると、次のようになります。

K = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001

57 番目のビットを最初のビット スポットに移動し、49 番目のビットを 2 番目のビット スポットに移動します。

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")

私がうまくいくと思ったロジックは、順列のタプルを列挙し、古いキーの各ビットについて、列挙を調べてビットに対応するインデックスを見つけ、適切な回数だけビットシフトすることでしたが、私にはできませんでした。これを行う方法がわかりません。間違った角度から問題に取り組んでいる可能性がありますが、ご指導いただければ幸いです。

4

1 に答える 1

0

わかりました、これはおそらく最も効率的な方法ではありませんが、これを機能させる方法を考え出しました...

関数を呼び出す前に、2 進数をリストに変換します。

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

誰かがこれに取り組むより良い方法を持っているなら、私はあなたの解決策を見たいです!

于 2013-02-13T00:34:48.520 に答える