Konvertieren Sie die Openssl HMAC SHA256 32-Byte-Ausgabe in eine 64-Byte-Zeichenfolge

Ich verwende die HMAC SHA256-Schnittstelle von OpenSSL, um eine Zeichenfolge zu hashen:

unsigned char* res = HMAC(EVP_sha256(), key, key_len, data, data_len, result, result_len);

Die Größe des resultierenden Hash `result_len` beträgt 32 Byte. Die Schnittstelle, für die ich programmiere, erfordert jedoch, dass der SHA256-Hash 64 Bytes groß ist.

Ich habe dieses Code-Snippet gefunden, das den gehashten Ausgabepuffer durchläuft und jedes Byte druckt:

for (unsigned int i = 0; i < result_len; i++)
{
    printf("%02hhX", result[i]);
}

https://stackoverflow.com/a/62458287/21129211

Das obige gibt die 64 Bytes aus, die ich erwarte (der Hash ist also korrekt).

Ich möchte den Puffer jedoch als Zeichenfolge in 64 Bytes konvertieren. Als ich von hier aus nach Base 64-Decodierungs- (und Codierungs-) Funktionen gesucht und diese verwendet habe:

https://stackoverflow.com/a/41094722/1107474

Leider hatte die zurückgegebene Zeichenfolge (sowohl Codierung als auch Decodierung) keine Ähnlichkeit mit dem erwarteten 64-Byte-Wert.

Wie kann ich die printf()-Ausgabe in eine 64-Byte-Zeichenfolge konvertieren?

🤔 А знаете ли вы, что...
C обеспечивает возможность создания пользовательских типов данных и структур.


65
1

Antwort:

Gelöst

Wie von @dbush kommentiert:

char buf[ 64 + 1 ];
char *at = buf;

for (unsigned int i = 0; i < result_len; i++)
{
    at += sprintf( at, "%02hhX", result[i] );
}

puts( buf ); // only for debugging purposes.

Sie könnten die Konsolidierung von Bytes (Bitverschiebung) untersuchen, um weniger Aufrufe an das Kraftpaket von sprintf() zu erhalten. Dazu müssten Sie die Endian-Eigenschaften Ihrer Architektur kennen.

BEARBEITEN
Es gibt auch eine einfache Standardversion zum Konvertieren von Bytes in Hex. Vergessen Sie nicht, den String nach Beendigung der Schleife zu beenden.

char buf[ 64 + 1 ];
char *at = buf;
char *hex = "0123456789ABCDEF";
for (unsigned int i = 0; i < result_len; i++)
{
    unsigned char c = result[i];
    *at++ = hex[ c >>   4 ];
    *at++ = hex[ c &  0xF ];
}
*at = '\0';