2017-01-29 5 views
0

を実装が提供されています。我々は単に既知の辞書の単語である別のキーを試す必要があります。は、私は現在C.</p> <p>平文、暗号文、鍵のサイズ、暗号化方式及び方法論でEVPを使用して、いくつかの簡単なテキストをブルートフォース攻撃のいくつかのテストをやっているのOpenSSL EVP暗号化

しかしそれがキーを見つけることができない

int main(int argc, char const *argv[]) { 
    evp((unsigned char *)"This is a top secret."); 
    return 0; 
} 

(同じ暗号を生成することはできません):私はMAIN LIKE THISから直接EVPメソッドを呼び出そうと

主な問題は、IS電話番号:clock();

int main(int argc, char const *argv[]) 
{ 
    clock_t begin = clock(); 
    evp((unsigned char *)"This is a top secret."); 
    return 0; 
} 

正常に機能します。なぜこうなった?私は間違って何をしていますか?誰かが問題の内容を説明することはできますか?

ivは16バイトのNULLであり、キーは長さが16より小さい1つの辞書ワードであり、その長さが小さい場合は空のスペースでフィードされるが、aes-128-cbcを使用して平文を暗号化する暗号化

int add_space(unsigned char *str, size_t len) { 

    int eol_pos = strlen((char *)str); 
    int empty_space = len - eol_pos - 1 ; 

    //set space and eol 
    memset(str+eol_pos, ' ', empty_space); 
    memset(str+len, '\0', 0); 

    return 0; 
} 
add_space方法は、単に空のスペースでキーを供給

void evp(unsigned char * plaintext) { 
    FILE *fp = fopen("words.txt", "r"); 
    const char cipher[] ="8d20e5056a8d24d0462ce74e4904c1b513e10d1df4a2ef2ad4540fae1ca0aaf9"; 
    unsigned char iv[16]; 
    unsigned char ciphertext[256]; 

    /**Init OpenSSL**/ 
    ERR_load_crypto_strings(); 
    OPENSSL_config(NULL); 
    OpenSSL_add_all_algorithms(); 

    unsigned char word[17]; 
    while(read_word(fp, word)==0) { 
     if(strlen((char *)word) < 16) { 
      add_space(word, sizeof(word)); 
      encrypt(plaintext, strlen((char *)plaintext), word, iv, ciphertext); 

      if(strcmp((char *)ciphertext, cipher) == 0) { 
       printf("The key is : %s\n", word); 
       fclose(fp); 
       exit(0); 
      }; 
     } 
    } 

    fclose(fp); 
} 

:16

より次のコードは、プロセス全体を実行するために使用され

read_word方法は、辞書から単一の単語読み:

int read_word(FILE *file, unsigned char * word) { 
    //Using fscanf 
    unsigned char word_buf[255]; 

    if(fscanf(file, "%s", word_buf) != EOF) { 
     if(strlen((char *)word_buf) < 15) { 
      strcpy((char *)word,(char *) word_buf); 
     } 
     return 0; 
    } 
    return 1; 
} 

をそしてencrypt方法は、平文を暗号化する主なプロセスです:

void encrypt(unsigned char *plaintext, int plain_len ,unsigned char *key, unsigned char * iv, unsigned char * ciphertext) { 
    EVP_CIPHER_CTX *ctx; 
    int out_len; 
    int ciphertext_len; 
    char *buff; 

    if(! (ctx = EVP_CIPHER_CTX_new())) { 
     handleErrors(); 
    } 

    if(EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv) != 1) 
     handleErrors(); 

    if(EVP_EncryptUpdate(ctx, ciphertext, &out_len, plaintext, plain_len) != 1) { 
     handleErrors(); 
    } 
    ciphertext_len = out_len; 

    if(EVP_EncryptFinal_ex(ctx, ciphertext+out_len, &out_len) != 1) { 
     handleErrors(); 
    } 
    ciphertext_len += out_len; 

    EVP_CIPHER_CTX_cleanup(ctx); 

    buff = malloc(ciphertext_len*2+1); 
    memset(buff, 0, ciphertext_len*2+1); 

    for (int i = 0; i < ciphertext_len; ++i) 
    { 
     char tmp[3]; 
     sprintf(tmp, "%02x", ciphertext[i]); 
     strcat(buff, tmp); 
    } 

    strcpy((char *)ciphertext, buff); 
    free(buff); 
} 

答えて

0

あなたが実際には何にivを設定することはありませんしています。 ivはローカル変数であるため、その内容は初期化されていないため、結果として未定義の動作が発生します。あなたがclockを呼び出すときに、おそらく何が起こっている

は、この機能によって使用されたスタック領域はおそらくちょうどそうencrypt関数が呼び出されたときにivが存在する場所であることを起こるスタック上のどこかに、いくつかのNULLバイトを残したということです。ただし、この動作に依存することはできません。

ivをすべて0に初期化します。それからあなたはあなたが期待する行動を得るでしょう。

unsigned char iv[16] = { 0 }; 
+0

ありがとうございました!それは魅力のように働く! 私は何もしていない場合、それは私のための初期化NULLと思った! あなたの迅速な対応に感謝します! さらなる研究が必要なようです:D – Hyperventilate

関連する問題