2012-02-07 10 views
2

私は現在、暗号化スキームDESの実装を試みていますが、早急に問題に遭遇しました。プログラムでビット単位の操作を行ったのはこれが初めてで、Cにはあまり習熟していません。私は順列とその逆数を適用し、結果は入力と同じではありません。DES - ビットと逆の並べ替え

私がしようとしているのは、64ビットのブロックに初期順列と逆順変換を適用することです。私は配列の入力で暗号化したい64ビットのブロックを持っています。順列テーブルIPに従って、私は最初のバイトの最初のビットを取り、それを置換のビット58として入れます。ビット2はビット50に送られ、以下同様に続く。順列の後、結果は半分に分割され、両側が入れ替えられます。これにより、同じアルゴリズムを使用してIPinverseテーブルを使用して戻すことができます。

include <stdio.h> 
include <stdlib.h> 

static unsigned char Positions[8] = {1,2,4,8,16,32,64,128}; 

int main() 
{ 
    unsigned char input[8] = {'a','b','c','d','e','f','g','h'}; 
    unsigned char permutation[8]; 
    unsigned char inverse[8]; 
    int i; 
    for (i = 0; i < 8; i++) { 
     permutation[i] = 0; 
     inverse[i] = 0; 
    } 

    int IP[8][8] ={{58,50,42,34,26,18,10,2}, 
          {60,52,44,36,28,20,12,4}, 
          {62,54,46,38,30,22,14,6}, 
          {64,56,48,40,32,24,16,8}, 
          {57,49,41,33,25,17, 9, 1}, 
          {59,51,43,35,27,19,11,3}, 
          {61,53,45,37,29,21,13,5}, 
          {63,55,47,39,31,23,15,7}}; 

    int IPinverse[8][8] ={{40,8,48,16,56,24,64,32}, 
             {39,7,47,15,55,23,63,31}, 
             {38,6,46,14,54,22,62,30}, 
             {37,5,45,13,53,21,61,29}, 
             {36,4,44,12,52,20,60,28}, 
             {35,3,43,11,51,19,59,27}, 
             {34,2,42,10,50,18,58,26}, 
             {33, 1,41, 9,49,17,57,25}}; 

    printf("\n Before: \n"); 
    for (i = 0; i < 8; i++) { 
     printf(" %c", input[i]); 
    } 

    // Initial permutation 
    int bit, newpos; 
    unsigned char desiredbit; 
    for (bit = 0; bit < 64; bit++) { 
     // Get the location for where the bit will be sent and translate it to array index 
     newpos = ((int)IP[bit/8][bit%8])-1; 
     // examine the bit we're currently considering 
     desiredbit = input[bit/8] & Positions[bit%8]; 
     // if equal to zero that means no change necessary 
     if (desiredbit != 0) { 
       // else it was a 1 and we need to set the appropriate bit to 1 
       desiredbit = Positions[newpos%8]; 
       permutation[newpos/8] = desiredbit^permutation[newpos/8]; 
     } 
    } 

    printf("\n Permutation: \n"); 
    for (i = 0; i < 8; i++) { 
     printf(" %c", permutation[i]); 
    } 

    // Perform swap 
    unsigned char tempcopy[4] = {0,0,0,0}; 
    int j; 
    for (j = 0; j < 4; j++) { 
     tempcopy[j] = permutation[j+4]; 
    } 
    for (j = 0; j < 4; j++) { 
     permutation[j+4] = permutation[j]; 
     permutation[j] = tempcopy[j]; 
    } 

    // Reverse Permutation, remember to swap left side with right 
    for (bit = 0; bit < 64; bit++) { 
     newpos = ((int)IPinverse[bit/8][bit%8])-1; 
     desiredbit = permutation[bit/8] & Positions[bit%8]; 
     if (desiredbit != 0) { 
       desiredbit = Positions[newpos%8]; 
       inverse[newpos/8] = desiredbit^inverse[newpos/8]; 
     } 
    } 

printf("\n Reverse Permutation: \n"); 
    for (i = 0; i < 8; i++) { 
     printf(" %c", inverse[i]); 
    } 

    return 0; 

}

+0

何が正しいのですか?どこが失敗し始めますか? – KevinDTimm

答えて

1
  1. あなたの順列は、1から64までのインデックスが含まれていますが、あなたがそれらを使用する方法、彼らはのためのスワップ何0
  2. 63にすべきですか?あなたが並べ替え、スワップして、再び並べ替えた場合、同じ場所には到達しません。
  3. 置換と逆が正反対であることを確認する必要があります。私は確かにすべての数字を調べてそれを検証するつもりはない。
+0

1.あなたが見ることができるインデックスは、すべて1で減算されているので、それらを0-63に変えます。 2.スワップはバグであることが分かった。これは、16回の暗号化が最初の順列に適用されたときの最終的な置換のために使用されるべきである。スワップを削除すると問題が解決しました。 3.表が正しい。 DES暗号化で使用されるテーブルの正確なコピーです。 [link] http://en.wikipedia.org/wiki/DES_supplementary_material#Final_permutation_.28IP-1.29 – Steinin

+0

3人で1人で十分にうまくいった。 – ugoren