2016-04-30 15 views
1

私は多数の4 * 4 sボックスのLATテーブル計算を求める暗号宿題を持っています。この目的のために、私はシンプルなC++プログラムを書いた。私は画像として質問テキストを添付しています。インストラクターが与えた数式がLATテーブル計算の一般的な式であるのか、それとも自分で作ったのか分かりません。私の問題は、私が準備したソフトウェアがすべてゼロのLATテーブルを与えることです。私はこの数式のためのテストベクトルを持っていません。私は以下のコードを添付します。線形近似表を知っている人がプログラムをチェックして問題の原因を教えてくれたら、私はとても喜んでいます。 (私はそれがうまく動作ビット変換部を確認!)事前に 感謝..線形近似テーブルの計算SBox

Ferda

enter image description here

答えて

2

私は問題はあなたが第二を使用することはありませんapplyDotFunc()

にすることができたとしパラメータ。私はvalue2ptrの作成で、あなたの意図ではなくvalue1

int applyDotFunc(int value1, int value2) 
{ 
    int value1arr[4] = { 0 }; 
    int* value1ptr = get_bits(value1, 4); 
    value1arr[0] = value1ptr[0]; 
    value1arr[1] = value1ptr[1]; 
    value1arr[2] = value1ptr[2]; 
    value1arr[3] = value1ptr[3]; 

    int value2arr[4] = { 0 }; 
    int* value2ptr = get_bits(value1, 4); // <-- should be value2 ? 
    value2arr[0] = value2ptr[0]; 
    value2arr[1] = value2ptr[1]; 
    value2arr[2] = value2ptr[2]; 
    value2arr[3] = value2ptr[3]; 

---- EDITのvalue2を使用していた、と仮定 ----

、犯罪を取りませんが、私はあなたを教えてくださいあなたのコードに関するいくつかの提案。オープンオーダー

1では

)あなたはgets_bits()に(メモリの小さな塊oをたくさん割り当て)、あなたはそれを解放することはありません。実際に直接割り当てられたメモリを使用したい場合(あなたの場合は必要ありません)、それを解放することを忘れないでください。

2)メモリとCスタイルの配列を直接割り当てないようにしてください。使用、代わりに、あなたが本当に直接C++でメモリを割り当てる必要がある場合は、new/deleteを使用してmalloc()/free()避けるSTLコンテナ

3)。そこに違いはありませんが、オブジェクトを割り当てるCスタイル・アレイの場合、malloc()は構築できません(とfree()を破壊することはできません)彼ら

4)あなたのget_Bits()/applyDotFunc()過剰に複雑です。それを見れば、value1 & value2が奇数上位ビットであるときにはapplyDotFunc()が戻り値1になり、value1 & value2が偶数上位ビットであるときに0を返すことがわかります。だから、あなたはこの単純な方法

int applyDotFunc (int valAnd) 
{ 
    int sumBits = 0; 

    for (int k = 0 ; k < 4 ; ++k) 
     sumBits += (0 != (valAnd & (1 << k))); 

    return sumBits & 1 ; 
} 

5でそれを書くことができ、配列と(value1 & value2を渡すために想定)を回避することができます)あなたは一つだけを使用することができるときあなたはfindApproxで3サイクルを使用します。それはあなたがapproxTableインデックスは1から15までであることを確信している)

void findApprox() 
{ 
    int c, d, e; 

    for (c = 1 ; c < 16 ; ++c)  //output mask 
     for (d = 1 ; d < 16 ; ++d) //input mask 
     { 
     approxTable[d][c] = -8; // initialize to -8; so there is no need 
           // to subtract at the end 

     for(e = 0 ; e < 16 ; ++e)   
      approxTable[d][c] += applyDotFunc(e & d)^applyDotFunc(sBox[e] & c); // a += x is simpler than a = a + x 
     } 
} 

6ことができますか?そして0から15までではない?

7)showApprox()で、eは未使用である

8)あなたはグローバル変数を使用します。これは不必要で(IMHO)危険です。彼らが疫病を好むのを避けてください。

P.S.:私の悪い英語に申し訳ありません

+0

こんにちはmaxx66を助け、私は数年のためのC++のコードを書いていないし、このコードはどの私は希望の宿題のためでした一度実行します。だから私は完璧なコードを書こうとしなかった。誰か(私のインストラクター)は、結果のLATテーブルをチェックし、それは真です。それが私にとって重要なことでした。あなたの時間と興味をありがとう:) –

4

ここにDES s-boxの線形近似テーブルを計算するための擬似コードがあります。

int x_i =0, y_i = 0, y_j=0,x_j =0, parity_11=0; 
int temp=0; 
for(x_i=0;x_i<64;x_i++){ 
    for(y_i=0;y_i<16;y_i++){ 
     for(x_j=0;x_j<64;x_j++){ 
      y_j=sbox_1[x_j]; 
      y_j=y_j&y_i; 
      temp=x_j&x_i; 
      parity_11=(parity(temp)+parity(y_j))%2; 
      parity_x_y[x_i][y_i]+=parity_11; 
      } 
     } 
    } 

次のように完全なコードを見つけることができます:

static const char sbox_1[] = { 
    14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 
    0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 
    4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 
    15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 
}; 
int parity(unsigned int x){ 
unsigned int count = 0, i, b = 1; 

for(i = 0; i < 8; i++){ 
    if(x & (b << i)){count++;} 
} 

if((count % 2)){return 1;} 

return 0; 
} 
int parity_x_y[64][16] ={}; 
void print_xor(){ 
int i=0,j=0; 
for(i=0;i<64;i++){ 
    j=0; 
    for(j=0;j<16;j++){ 
     printf("%d ",parity_x_y[i][j]); 
    } 
    printf("\n"); 
    } 

} 

void print_LAT(){ 
int x_i =0, y_i = 0, y_j=0,x_j =0, parity_11=0; 

int temp=0; 
print_xor(); 
for(x_i=0;x_i<64;x_i++){ 
    for(y_i=0;y_i<16;y_i++){ 
     for(x_j=0;x_j<64;x_j++){ 
      y_j=sbox_1[x_j]; 
      y_j=y_j&y_i; 
      temp=x_j&x_i; 
      parity_11=(parity(temp)+parity(y_j))%2; 
      parity_x_y[x_i][y_i]+=parity_11; 
      } 
     } 
    } 
    int j=0; 
print_xor(); 
} 

int main(){ 
    print_LAT(); 
    return 0; 
} 

希望は、これが

関連する問題