0

一部の文字列の sha1 ハッシュを作成するために作成した関数に問題があります。この関数は、4 文字を超える文字列に対して有効なハッシュを生成しますが、それ未満の文字のハッシュは正しくありません。私は解決策を探していましたが、何が悪いのかわかりません。

int create_hash(char *plaintext, char *digest) {
char digest_buff[3];
DWORD buf_size = SHA1_HASH_LEN;
HCRYPTPROV prov;
HCRYPTHASH hash;
BYTE rgbHash[SHA1_HASH_LEN];
CHAR rgbDigits[] = "0123456789abcdef";
int i;

if(!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
    if(DEBUG) {
        printf("CryptAcquireContext failed: %d\n", GetLastError());
    }
    return SHA1_FAILED;
}

if(!CryptCreateHash(prov, CALG_SHA, NULL, NULL, &hash)) {
    if(DEBUG) {
        printf("CryptCreateHash failed: %d\n", GetLastError());
    }
    return SHA1_FAILED;
}

if(!CryptHashData(hash, (BYTE *)plaintext, sizeof(hash), NULL)) {
    if(DEBUG) {
        printf("CryptHashData failed: %d\n", GetLastError());
    }
    return SHA1_FAILED;
}

if(!CryptGetHashParam(hash, HP_HASHVAL, rgbHash, &buf_size, NULL)) {
    if(DEBUG) {
        printf("CryptGetHashParam failed: %d\n", GetLastError());
    }
    return SHA1_FAILED;
}

for(i=0; i < buf_size; i++) {
    sprintf(digest_buff, "%c%c", rgbDigits[rgbHash[i] >> 4], rgbDigits[rgbHash[i] & 0xf]);
    strcat(digest, digest_buff);
}

if(!CryptDestroyHash(hash)) {
    if(DEBUG) {
        printf("CryptDestroyHash failed: %d\n", GetLastError());
    }
    return SHA1_FAILED;
}

if(!CryptReleaseContext(prov, NULL)) {
    if(DEBUG) {
        printf("CryptReleaseContext failed: %d\n", GetLastError());
    }
    return SHA1_FAILED;
}

if(DEBUG) {
    printf("digest: %s\n", digest);
}

return 0;

}

4

1 に答える 1

3

CryptHashDataデータの長さを3 番目のパラメーターとして受け取り、そこにハッシュ バッファーのサイズを渡します。そこに strlen(plaintext) のようなものを渡す必要があります。

于 2012-09-08T09:31:36.730 に答える