Nano Hash - криптовалюты, майнинг, программирование

Отладка результатов хеширования: длины, массивы, символы

Имеют ли эти результаты смысл?

Я пытаюсь понять, как работает mhash, но кто-нибудь знает, как эти результаты имеют смысл?

mac является символом, и на основе strlen его длина равна 16, однако этот пример программы, предоставленный mhash, выводит следующий хэш в шестнадцатеричном формате (.x) 750c783e6ab0b503eaa86e310a5db738. И длина этого mac[i] в ​​два раза больше размера 16 , у кого-нибудь есть идеи, почему это может быть?

// output result
// 0x750c783e6ab0b503eaa86e310a5db738 (MD5) (32)
// mac length: 16
// md5 length: 16

#include <mhash.h>
#include <stdio.h>
#include <string.h>

int main()
{
    char password[] = "Jefe";
    int keylen = 4;
    char data[] = "what do ya want for nothing?";
    int datalen = 28;

    MHASH td;
    unsigned char *mac;
    int i, j;

    td = mhash_hmac_init(MHASH_MD5, password, keylen, mhash_get_hash_pblock(MHASH_MD5));

    mhash(td, data, datalen);
    mac = mhash_hmac_end(td);

    int md5len = mhash_get_block_size(MHASH_MD5);

    printf("0x");
    for (i = 0; i < md5len; i++)
    {
        printf("%.2x", mac[i]);
    }
    printf("\n");

    // I don't understand how the mac is a different size than the version printed out!?
    printf("%x\n", mac);

    int maclen = strlen(mac);
    printf("mac length: %d\n", maclen);
    printf("md5 length: %d\n", md5len);

    exit(0);
}

Кроме того, если я попытаюсь вывести mac с помощью printf, как показано ниже:

printf("%x\n", mac);

Я бы получил это:

u
 x>j����n1
]�8

API для mhash можно найти здесь: http://mhash.sourceforge.net/mhash.3.html

заранее спасибо за помощь

07.07.2014

  • Подсказка: шестнадцатеричное представление одного байта состоит из двух шестнадцатеричных цифр. 07.07.2014
  • Вы не можете распечатать массив байтов как %x. Вы должны просмотреть свои данные и распечатать каждый байт отдельно (лучше как %02x). 07.07.2014
  • printf(..., mac) возьмет адрес первого байта массива mac. И %x попытается напечатать его в шестнадцатеричном формате. Ваш вывод кажется мне больше похожим на %s, учитывая, что он имеет ровно 16 байтов (предположим, что каждая новая строка добавляет только один байт, '\n'). 07.07.2014
  • Также обратите внимание, что strlen(mac), вероятно, не определен (я не знаю конкретно mhash, но, скорее всего, он не определен). 07.07.2014

Ответы:


1

Не принимайте mac как строку (ни как массив символов, ни как указатель на первый символ строки).

mac следует читать как массив байтов, размер которого заранее известен (результат mhash_get_block_size).

strlen(mac) не определено. Только случайно вы получите правильный размер (подумайте о хэше, который имеет нулевой байт: он преждевременно завершит строку «хочу быть»).

07.07.2014
  • Хорошо, большое спасибо, так что думайте о mac как о массиве байтов, понял! Итак, в основном, если я хочу узнать его длину, все, что мне нужно сделать, это умножить размер блока на 2? 07.07.2014
  • Нет. Его размер равен точно размеру блока. Вы должны понимать отдельно размер вашего хеша (для MD5 это 16 байт) и длину его преобразования в символы. 07.07.2014
  • Его шестнадцатеричное представление в два раза больше, потому что каждый байт занимает две шестнадцатеричных цифры (от 00 до ff). 07.07.2014
  • Кроме того, есть идеи, для чего могут быть пароль и ключ? Я знаю, что на самом деле это не является частью вопроса, но было бы здорово, если бы я мог внести свой вклад, я буду изучать, зачем нам нужны эти два атрибута. 07.07.2014
  • Если вы представляете хэш (16 байт = 128 бит) в base64 (другая кодировка, где каждая цифра может представлять 6 бит), тогда потребуется 22 символа (последний только частично). 07.07.2014
  • Это имелось в виду пароль и ключ? 07.07.2014
  • пароль является ключом. Что касается переменной keylen, то это просто sizeof password - 1 (-1, чтобы убрать автоматический \0). На самом деле вы вычисляете не MD5 (в смысле четкой контрольной суммы MD5), а HMAC который использует MD5 Подписать данные. Ключ (или password здесь) — это часть информации, которую следует держать в секрете, чтобы гарантировать, что ваши данные не были затронуты (иначе хеш-подпись будет другой). 07.07.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..