2016-04-30 8 views
1

Ich habe eine Kryptologie Hausaufgaben, die für LAT-Tabelle Berechnung für zahlreiche 4 * 4 s-Boxen fragt. Zu diesem Zweck habe ich ein einfaches C++ Programm geschrieben. Ich füge den Fragetext als Bild an. Ich bin mir nicht sicher, ob die Formel, die der Lehrer gab, eine allgemeine Formel für die LAT-Tabellenberechnung ist oder er sie selbst gemacht hat. Mein Problem ist die Software, die ich vorbereitet habe, gibt eine LAT-Tabelle mit allen Nullen. Ich habe keinen Testvektor für diese Formel. Ich werde den folgenden Code anhängen. Ich würde mich freuen, wenn jemand, der sich mit linearen Approximationstabellen auskennt, das Programm überprüfen und mir sagen könnte, wo das Problem liegt. (Ich habe das Teil Bitumwandlung es funktioniert ok!) Vielen Dank im Voraus ..Linear Approximationstabelle Berechnung für SBox

Ferda

enter image description here

Antwort

2

Ich nehme an, dass das Problem sein kann, in applyDotFunc()

Sie nie die zweite verwenden Parameter. Ich nehme an, dass in value2ptr Schöpfung, Ihre Absicht value2 statt 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 ----

Bitte nicht übel nehmen zu verwenden, aber ich gebe Ihnen einige Vorschläge zu deinem Code

In offener Ordnung

1) Sie viel o kleine Brocken von Speichern zuweisen (in gets_bits()) und Sie nie frei, es; Wenn Sie wirklich direkt zugewiesenen Speicher verwenden möchten (aber in Ihrem Fall ist nicht notwendig), vergessen Sie nicht, es zu befreien

2) versuchen, direkt zugeordneten Speicher und C-artige Arrays zu vermeiden; Verwendung stattdessen STL-Container

3), wenn Sie wirklich Speicher zuweisen müssen, um direkt in C++, verwenden new/delete und malloc()/free() vermeiden. Im Falle eines Array C-Stil nicht Unterschied gibt es aber, Objekte Zuweisung kann malloc() nicht bauen (und free() nicht zerstören) sie

4) Ihre get_Bits()/applyDotFunc() ist zu kompliziert. Werfen Sie einen Blick darauf und Sie werden sehen, dass applyDotFunc() 1 zurückgibt, wenn value1 & value2 mit ungeraden hohen Bits ist und 0 zurückgibt, wenn value1 & value2 mit geraden hohen Bits ist. So können Sie Array vermeiden und (unter der Annahme value1 & value2 passieren) Sie es in dieser einfacheren Weise schreiben können

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

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

    return sumBits & 1 ; 
} 

5) Sie drei Zyklen in findApprox verwenden, wenn Sie einen verwenden können nur; es können Sie sicher sind,

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) sein, dass approxTable Indizes von 1 bis 15 sind? Und nicht von 0 bis 15?

7) in showApprox(), e ist ungenutzt

8) Sie globale Variablen verwenden; das ist unnötig und (IMHO) gefährlich. Vermeide es wie eine Plage.

p.s.: Entschuldigung für mein schlechtes Englisch

+0

Hallo maxx66, ich war nicht C Schreiben ++ Code für Jahre und dieser Code war für eine Hausaufgaben, das ich Renne einmal. Also habe ich nicht versucht, den perfekten Code zu schreiben. Jemand (Mein Lehrer) hat die resultierende LAT-Tabelle überprüft und es ist wahr. Das war das Wichtigste für mich. Vielen Dank für Ihre Zeit und Interesse :) –

4

Hier ist ein Pseudocode zur Berechnung der linearen Approximationstabelle für eine DES-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; 
      } 
     } 
    } 

komplette Code kann wie folgt ermittelt werden:

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; 
} 

this helps