Сравните часть дайджеста sha1 с шестнадцатеричной строкой в ​​C - PullRequest
0 голосов
/ 08 декабря 2010

У меня есть строка, для которой я вычисляю дайджест sha1 следующим образом:

SHA1(sn, snLength, sha1Bin);

Если я прав, это приводит к 20-байтовому символу (с двоичными данными).Я хочу сравнить последние 3 байта этого символа с другим символом.Этот символ содержит строку "6451E6".64, 51 и E6 - шестнадцатеричные значения.Как преобразовать «6451E6», чтобы я мог сравнить его с помощью:

if(memcmp(&sha1Bin[(20 - 3)], theVarWithHexValues, 3) == 0)

{

}

У меня есть эта функция:

/*
 * convert hexadecimal ssid string to binary
 * return 0 on error or binary length of string
 *
 */
u32 str2ssid(u8 ssid[],u8 *str) {
    u8 *p,*q = ssid;
    u32 len = strlen(str);

    if( (len % 2) || (len > MAX_SSID_OCTETS) )
      return(0);

    for(p = str;(*p = toupper(*p)) && (strchr(hexTable,*p)) != 0;) {

      if(--len % 2) {
        *q = ((u8*)strchr(hexTable,*p++) - hexTable);
        *q <<= 4;
      } else {
        *q++ |= ((u8*)strchr(hexTable,*p++) - hexTable);
      }
    }
    return( (len) ? 0 : (p - str) / 2);
}

, которая делает то же самое, но я новичок в C ине понимаю: - (

Ответы [ 4 ]

3 голосов
/ 08 декабря 2010

Проще пойти другим путем - преобразовать двоичные данные в шестнадцатеричную строку для сравнения:

char suffix[7];
sprintf(suffix, "%02x%02x%02x", sha1Bin[17], sha1Bin[18], sha1Bin[19]);
return stricmp(suffix, theVarWithHexValues) == 0;

Даже если вы предпочитаете преобразовывать в двоичные данные, sscanf(...%2x...) лучше, чем ручной синтаксический анализ шестнадцатеричных чисел.

1 голос
/ 08 декабря 2010

Если theVarWithHexValues действительно какая-то константа, то проще всего было бы перевести ее в двоичную форму напрямую. Вместо:

const char *theVarWithHexValues = "6451E6";

использование:

const char *theVarWithHexValues = "\x64\x51\xE6";

... тогда вы можете просто memcmp() напрямую.

1 голос
/ 08 декабря 2010

Исправлено для кода AShelly:

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

int hashequal(const unsigned char *sha1Bin, const char *hexstr) {
    unsigned long hexvar = strtoul(hexstr, NULL, 16);
    unsigned char theVarWithHexValues[] = { hexvar >> 16, hexvar >> 8, hexvar };
    return memcmp(sha1Bin + 17, theVarWithHexValues, 3) == 0;
}

int main() {
    unsigned char sha1Bin[20];
    sha1Bin[17] = 0x64;
    sha1Bin[18] = 0x51;
    sha1Bin[19] = 0xE6;
    printf("%d\n", hashequal(sha1Bin, "6451E6"));
    printf("%d\n", hashequal(sha1Bin, "6451E7"));
}
0 голосов
/ 08 декабря 2010
char* hexstr = "6451E6";
unsigned long hexvar = strtoul(hexstr, NULL, 16);
hexvar = htonl(hexvar)<<8;  //convert to big-endian and get rid of zero byte.

memcmp(&sha1Bin[(20 - 3)], (char*)hexvar, 3)
...