OpenSll MD2 разные данные

308
23 мая 2017, 04:08

Использую MD2 хеш-функцию. Не могу понять почему при одинаковых строках результат разный. И как тогда сравнивать их между собой после использование хещ-функции.

 #include <iostream>
    #include <openssl\mdc2.h>
    using namespace std;
    int main();

int main()
{
    setlocale(LC_ALL, "ru");                    // корректное отображение Кириллицы
    char decrypted[128] = " ", message[128] = " ", IfFile[128] = " ", OfFile[128] = " ";
    unsigned char userKey[128] = " "; // буфер промежуточного хранения считываемого из файла текста
    int n;
    MDC2_CTX md2;
    unsigned char mdchar[3][100] = { "привет", "пока", "привет"};
    MDC2_Init(&md2);
    MDC2_Final(*mdchar, &md2);
    cout << mdchar;
    unsigned char md[10][MDC2_DIGEST_LENGTH];
       int i;
       MDC2_CTX c;
       static char *text[2] = { "Hello" , "Hello"};

         MDC2_Init(&c);
         MDC2_Update(&c, (const unsigned char*)text[1], strlen(text[1]));
         MDC2_Final(&(md[0][0]), &c);
         MDC2_Update(&c, (const unsigned char*)text[0], strlen(text[0]));
         MDC2_Final(&(md[1][0]), &c);

        // cout << md[1];
            for (i = 0; i < MDC2_DIGEST_LENGTH; i++)
            printf("%02X", md[0][i]);
            printf("\n");
            for (i = 0; i < MDC2_DIGEST_LENGTH; i++)
                printf("%02X", md[1][i]);
                printf("\n");
                int q;
                cin >> q;
}
Answer 1

Этот код изменил

   MDC2_Init(&c);
             MDC2_Update(&c, (const unsigned char*)text[1], strlen(text[1]));
             MDC2_Final(&(md[0][0]), &c);

На MDC2((const unsigned char*)s, strlen(s), md[nn]); Как я понял это все из-за того что у меня было хеширование состояние теряло, и поэтому хэшировало по другому.

Вот рабочий код на Visual Studio 2015 с библиотекой OpenSSL. Может кому понадобиться.

#include "stdafx.h"
#include <openssl\camellia.h>

#include <fstream>
#include <vector>
#include <string>
#include <iostream>
#include <openssl\mdc2.h>
using namespace std;
int main();

int main()
{
    setlocale(LC_ALL, "ru");                    // корректное отображение Кириллицы
            vector<string> arr;
            vector<string>::iterator i;
            ifstream ifs;
            string str;
            ifs.open("file.txt");
            if (!ifs.is_open()) {
                cerr << "Can't open file" << endl;
                return 1;
            }
            while (!ifs.eof()) {
                getline(ifs, str);
                arr.push_back(str);
            }
            ifs.close();
            int nn = 0;
            int size = arr.size();
            unsigned char md[100][MDC2_DIGEST_LENGTH];
            unsigned char qq[MDC2_DIGEST_LENGTH];

            for (i = arr.begin(); i != arr.end(); i++)
            {
                //cout << *i << endl;
                const char *s = (*i).c_str();
                MDC2((const unsigned char*)s, strlen(s), md[nn]); //хеш - функция md2
                nn++;
            }
            for (int j = 0; j < size; j++) {
                cout << arr[j] << ": ";
                for (int q = 0; q < MDC2_DIGEST_LENGTH; q++)
                    printf("%02X", md[j][q]);
                 printf("\n");
            }
            string nom;
            unsigned char result[MDC2_DIGEST_LENGTH];
            cout << "Введите строку для поиска: ";
            cin >> nom;
            const char *nomer = nom.c_str();

            MDC2((const unsigned char*)nomer, strlen(nomer), result); //хеш-функция md2 для искомой строки

            for (int q = 0; q < MDC2_DIGEST_LENGTH; q++)
                printf("%02X", result[q]);
            cout << " :";
            for (int z = 0; z < size; z++)
            {
                if (memcmp(md[z], result, MDC2_DIGEST_LENGTH) == 0) //сравнивание строк
                {
                    cout << "Подходит: "  << arr[z] << endl;
                    break;
                }
            }
            system("pause"); // Команда задержки экрана
    return 0;
}

И само задание как звучало.

Преобразование строки с использованием хеш-функции MD2. На входе программы файл со списком строк, с помощью хеш-функции преобразуем все строки. Затем на вход подаем искомую строку, также с помощью хеш-функции преобразовываем ее и ищем в общем списке преобразованных строк.

READ ALSO
Как разобраться с кодировкой в QT?

Как разобраться с кодировкой в QT?

ЗдравствуйтеИмеется проблема с кодировкой в QT Creator

406
Собрать header only dll с помощью cmake

Собрать header only dll с помощью cmake

Хочу собрать dll с помощью cmakeИспользую следующий код:

254
Непонятная формула и её результат

Непонятная формула и её результат

есть задача найти значение функции

264
Ошибка в клиенте приложения

Ошибка в клиенте приложения

Использую клиент из примера http://citforumru/book/cook/winsock

285