• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

md5 на ESP32 делюсь опытом

p-a-h-a

Member
Не нашел такой темы на рунете, братья китайцы подсказали. (Первоисточник)
На Ардуино выглядит так:
C++:
#include "rom/md5_hash.h" // для void md5_test
#include "mbedtls/md5.h" // для void mbed_tls_md5

int i, ret = 0;
unsigned char mbedtls_md5sum[16];
unsigned char content[] = "admin"; // Строка, md5 которой будем вычислять

void setup(){
  Serial.begin(115200);
  }
void md5_test(unsigned char *content) {
  struct MD5Context md5;
  MD5Init(&md5);
  unsigned char hash[17]="";
    
    MD5Update(&md5, content, strlen((const char *)content));
    MD5Final(hash,&md5);
    Serial.printf("\r\n************** MD5 Digest*******************\r\n");
    for (i = 0; i < 16; i++)// В исходнике было 17 вместо 16 и выписывало лишних два ноля
    {
        Serial.printf("%02x",hash[i]);
    }
}

void mbed_tls_md5(unsigned char *content,unsigned char *mbedtls_md5sum)
{
    ret = mbedtls_md5_ret(content, strlen((const char *)content), mbedtls_md5sum);
    if( ret != 0 )
        Serial.printf( "mbedtls_md5_ret() failed\n" );
    else
    {
        Serial.printf("\r\n************ mbedtls_md5_ret result ****************\r\n");
        for (i = 0; i < 16;i++)
        {
            Serial.printf("%02x", mbedtls_md5sum[i]);
        }
    }
}

void loop(){
    md5_test(content);
    mbed_tls_md5(content, mbedtls_md5sum);
    Serial.printf("\r\n************* END **************");
    fflush(stdout);
    delay(5000);
    }
В Serial:
Код:
************** MD5 Digest*******************
21232f297a57a5a743894a0e4a801fc3
************ mbedtls_md5_ret result ****************
21232f297a57a5a743894a0e4a801fc3
************* END **************
 

p-a-h-a

Member
Один вопросик к знающим строки: как заменить
C++:
unsigned char hash[17]="1";
Serial.printf("%02x",hash);
на:
C++:
String MD5 = sprintf("%02x",hash); // Не работает
Пока так выкрутился:
C++:
if (hash<0x10) MD5 +="0";
MD5 += String(hash,HEX);
 

p-a-h-a

Member
Для себя доделал рабочий вариант MD5 отдающий строку хеша. Конечный результат:
C++:
#include <WiFi.h>
#include "mbedtls/md5.h"
#define  Login "admin"
#define  Password "123456"
void setup() {
  Serial.begin(115200);
  String uuid = MD5(WiFi.macAddress());
  String hash = MD5(MD5(Login) + MD5(Password));
  Serial.println(uuid);
  Serial.println(hash);
}

String MD5(String buf) { 
  unsigned char content[64], mbedtls_md5sum[16]; // 64 - максимальный размер буфера принимаемой строки
  for (int i = 0; i < buf.length(); i++) {
    content[i] = buf.charAt(i);
  } String MD5;
  int ret = mbedtls_md5_ret(content, buf.length(), mbedtls_md5sum);
  for (byte i = 0; i < 16; i++) {
    if (mbedtls_md5sum[i] < 0x10) MD5 += "0";
    MD5 += String(mbedtls_md5sum[i], HEX); //Serial.printf("%02x", mbedtls_md5sum[i]);
  } return MD5;
}

void loop() {}
В Serial:
Код:
6584917566d2f82d14a711f67154f531
a8f283efb0a7639652c9f09012f43cbb
 
Сверху Снизу