将sha1摘要的一部分与C中的十六进制字符串进行比较

时间:2010-12-07 21:18:19

标签: c hex sha1

我有一个字符串,我可以像这样计算sha1摘要:

SHA1(sn, snLength, sha1Bin);

如果我是正确的,则会产生20字节的字符(带有二进制数据)。我想比较这个char的最后3个字节与另一个char。此char包含字符串“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 个答案:

答案 0 :(得分:3)

更容易走另一条路 - 将二进制数据转换为十六进制字符串进行比较:

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

即使您更喜欢转换为二进制,sscanf(...%2x...)也比手动解析十六进制数更好。

答案 1 :(得分:1)

修复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"));
}

答案 2 :(得分:1)

如果theVarWithHexValues确实是某种常量,那么最简单的方法就是将其直接放入二进制形式。而不是:

const char *theVarWithHexValues = "6451E6";

使用:

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

...然后你可以直接memcmp()

答案 3 :(得分:0)

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)