2013-07-03 3 views
-3

Мое первое сообщение. :)Временная атака C - преобразованная из java

В последние недели я написал Реализация Timing атаки в Java для метода:

static char[] a = new char[] { 's', 'e', 'c', 'r', 'e', 't', '1' }; 

static boolean passwordCompare(char[] a, char[] b){ 
    int i; 
    if (a.length != b.length) 
     return false; 
    for (i = 0; i < a.length && a[i] == b[i]; i++); 
     return i == a.length;} 

Все шло, как и ожидалось. Но тогда я хотел написать ту же атаку в C, потому что это язык программирования, который я пытаюсь изучить на данный момент, и ничего не происходит.

Буду признателен за каждую небольшую помощь. :)

password_compare.o - это lib, где метод password_compare (const char * password) и секретный пароль лежит.

Cheers!

#include <stdio.h> 
#include <time.h> 
#include <stdbool.h> 
#include <stdlib.h> 
#include <math.h> 
#include <stdarg.h> 
#include <stdbool.h> 
#include <stddef.h> 
#include <stdint.h> 
#include <stdio.h> 
#include <string.h> 
#include <time.h> 
#include "password_compare.o" 

/* foreach macro for using a string as a collection of char */ 
#define foreach(ptrvar, strvar) char* ptrvar; for(ptrvar=strvar ; 
     (*ptrvar) != '\0' ; *ptrvar++) 


int main(void) 
{ 
    // variables 
    int counter; 
    char[] test; 
    long begin, end, begin2, end2; 
    long duration; 
    long duration2; 
    long store = 0; 
    char [] storechar; 
    char[] tester; 
    char [] storechar2; 

// Try to find out the length from the password. 
// Longest time = password.length. 
    for(int i=0; i<=10; ++i) 
    { 
     test = new char[i]; 
     for(int j=0; j<i; ++j) 
     { 
      test[j]=a; 
     } 

     const char [] fixtest = test; 
     time_t start = time(0); 
     for (int k=0; k<1000000000;k++) 
     { 

     password_compare(fixtest); 
     } 

     time_t end = time(0); 
     duration = end-start; 
     if(duration > store) 
      { 
      store = duration; 
      storechar = test; 
      counter = i; 
      } 


     printf("Duration (" + i + ") = " + duration); 
    } 

    printf("The right length is :" + storechar.length); 

    int len=sizeof(storechar)/sizeof(int); 
    storechar2 = new char[len]; 
    tester = new char[counter]; 

    // Iterate through each position from the password array. 
    for (int h=0; h<len; h++) 
    { 
     long store2 = 0; 

     // Generate an char[] as String 
     // with all possible characters. 
     char* s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabc 
        defghijklmnopqrstuvwxyz1234567890"; 

     // Check for each character from s1 ... 

     foreach(p1, s1) 
      { 
      tester[h] = *p1; 
      const char [] fixtester = tester; 

      // Check for each p1 in s1 at Position h the time. 
      //The largest value will be saved at Pos h. 

       if (h < (len-1)) 
       { 

        time_t start2 = time(); 
       for (int k = 0; k<1000000000;k++) 
       { 
       password_compare(fixtester); 
       } 
       for (int p = 0; p<1000000000;p++) 
       { 
       password_compare(fixtester); 
       } 

       time_t end2 = time(); 
       duration2 = end2-begin2; 
       if (duration2 > store2) 
       { 
        store2 = duration2; 
       storechar2[h] = *p1; 
       } 
      printf("Duration (" + *p1 + ") = " + duration2); 
       } 

      // else if h == password.length, then try 
      // every character at the last position. 

      else if (password_compare(fixtester) == true) 
       { 
        storechar2[h] = *p1; 
        printf("Character at Pos " + (h + 1) + ": ") 
        printf("storechar2[%d]: %d\n",h,storechar2[h]); 
        printf("The Password is: "); 

         for(int b = 0; i < my_array.length; i++) 
          {printf("%d ",storechar2[b]);} 


        exit(0); 

       } 
      } 

     printf("Character at Pos " + (h + 1) + ": "); 
     printf("storechar2[%d]: %d\n",h,storechar2[h]); 
     tester[h] = storechar2[h]; 
    } 

     // The Password was guessed wrong! 
     printf("Failed"); 
     exit(0); 
     return(0); 

}

+0

это поможет, если вы отформатируете код. и разделить его на функции. – Elazar

+2

BTW, '#include" password_compare.o "' is * wrong *. вы должны передать его компилятору (на самом деле компоновщику), а не добавлять к нему '# include'. – Elazar

+1

Я не понимал, что C имеет цикл «foreach» ... Это, и ваш цикл Java просто неуловим. Вы сравниваете строки с '==', и если он когда-либо * введет * цикл, он немедленно вернется. Для этого вам нужна другая конструкция. – Makoto

ответ

0

Есть несколько синтаксических ошибок, например:

#define foreach(ptrvar, strvar) char* ptrvar; for(ptrvar=strvar ; 
    (*ptrvar) != '\0' ; *ptrvar++) 

Только первая линия является частью макроса. Чтобы использовать несколько строк, добавьте обратную косую черту в конце.

char [] storechar; 
storechar2 = new char[len]; 

Этот синтаксис массива из Java. Проверьте, как определить массивы в C.

#include "password_compare.o" 

Это заполняет файл мусором. Вы хотите включить заголовочные файлы, а не файлы объектов.

Если вы не можете исправить проблемы, начните с нового файла и добавьте одну вещь за раз. Убедитесь, что он компилируется, прежде чем добавлять что-либо еще. Если есть ошибка, обратите внимание на точное сообщение и строки, вызвавшие его.

Смежные вопросы