2014-10-27 2 views
0

Когда я вычисляю sha256-дайджест файла с помощью командной строки openssl, он полностью отличается от дайджеста, сгенерированного в C++, с помощью библиотеки openssl.OpenSSL digest: разные результаты в командной строке и в C++

командной строки:

openssl dgst -binary -sha256 MyFile.txt 

C++:

BIO* bio = BIO_new_file("MyFile.txt", "rb"); 
if (bio != NULL) 
{ 
    OpenSSL_add_all_digests(); 
    const EVP_MD* md = EVP_sha256(); 

    if (md != NULL) 
    { 
     EVP_MD_CTX* ctx = EVP_MD_CTX_create(); 

     if (EVP_DigestInit_ex(ctx, md, NULL)) 
     { 
     const int bufLength = 4096; 
     unsigned char buf[bufLength]; 
     unsigned int len; 

     while (BIO_read(bio, buf, bufLength)) 
      EVP_DigestUpdate(ctx, buf, bufLength); 

     unsigned char digest[EVP_MAX_MD_SIZE]; 

     int ok = EVP_DigestFinal_ex(ctx, digest, &len); // ok == 1; digest in variable "digest" is totally different from the one calculated on command-line 
     } 

     EVP_MD_CTX_cleanup(ctx); 

     BIO_free_all(bio); 
    } 
} 

почему дайджеста с помощью C Расчетные ++ совершенно разные, чем вычисленного в командной строке? (MyFile.txt не имеет разрывов строк или пробелов в нем)

Уважения, Matthias

ответ

0

Вы обрабатываете чтение неправильно. С этой codechange, хэш правильно:

  int readlen; 

      while ((readlen = BIO_read(bio, buf, bufLength)) > 0) 
      { 
       EVP_DigestUpdate(ctx, buf, readlen); 
      } 

В общем, вы должны иметь больше обработки ошибок, чтобы сделать код более надежным.

Приветствия,

/Erik Alapää

+0

спасибо за ваш ответ, но это не сработало => readlen «всегда» 1 (кроме случаев, когда файл читается до конца) – Matthias

+0

я также пытался прочитать файл с QT (QFile.readAll), там хеш также отличается от того, который рассчитан в командной строке – Matthias

+0

Да, это работает. Вы скопировали стенографию while? Скобки важны. Когда я читаю свой тестовый файл, он читает 4096 байт 2 раза, а за последним чтением следует 1655 байт. И шестнадцатеричный хэш точно соответствует командной строке ssl hash. –

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