dilsdgr8 Ответов: 1

Шифрование с использованием bcrypt (VC++)


Я использовал алгоритм SHA256 для получения хэша.
Хэш, созданный моим приложением, не совпадает с хэшем, созданным онлайн-инструментами для той же строки.

Что я уже пробовал:

        BCRYPT_ALG_HANDLE       hAlg            = NULL;
        BCRYPT_HASH_HANDLE      hHash           = NULL;
        NTSTATUS                status          = STATUS_UNSUCCESSFUL;
        DWORD                   cbData          = 0,
            cbHash          = 0,
            cbHashObject    = 0;
        PBYTE                   pbHashObject    = NULL;
        PBYTE                   pbHash          = NULL;


        //open an algorithm handle
        if(!NT_SUCCESS(status = BCryptOpenAlgorithmProvider(
            &hAlg,
            BCRYPT_SHA256_ALGORITHM,
            NULL,
            0)))
        {
            goto Cleanup;
        }

        //calculate the size of the buffer to hold the hash object
        if(!NT_SUCCESS(status = BCryptGetProperty(
            hAlg, 
            BCRYPT_OBJECT_LENGTH, 
            (PBYTE)&cbHashObject, 
            sizeof(DWORD), 
            &cbData, 
            0)))
        {

            goto Cleanup;
        }

        //allocate the hash object on the heap
        pbHashObject = (PBYTE)HeapAlloc (GetProcessHeap (), 0, cbHashObject);
        if(NULL == pbHashObject)
        {

            goto Cleanup;
        }

        //calculate the length of the hash
        if(!NT_SUCCESS(status = BCryptGetProperty(
            hAlg, 
            BCRYPT_HASH_LENGTH, 
            (PBYTE)&cbHash, 
            sizeof(DWORD), 
            &cbData, 
            0)))
        {

            goto Cleanup;
        }

        //allocate the hash buffer on the heap
        pbHash = (PBYTE)HeapAlloc (GetProcessHeap (), 0, cbHash);
        if(NULL == pbHash)
        {

            goto Cleanup;
        }

        //create a hash
        if(!NT_SUCCESS(status = BCryptCreateHash(
            hAlg, 
            &hHash, 
            pbHashObject, 
            cbHashObject, 
            NULL, 
            0, 
            0)))
        {

            goto Cleanup;
        }


        PCWSTR pwTst = (PCWSTR)csText_i;
        //hash some data
        if(!NT_SUCCESS(status = BCryptHashData(
            hHash,
            (PBYTE)pwTst,
            sizeof(rgbMsg),
            0)))
        {

            goto Cleanup;
        }

        //close the hash
        if(!NT_SUCCESS(status = BCryptFinishHash(
            hHash, 
            pbHash, 
            cbHash, 
            0)))
        {
            goto Cleanup;
        }

PCWSTR pTst = (PCWSTR)pbHash;
csEnryptedText_o = pTst;




Это из-за того, как я бросаю??

1 Ответов

Рейтинг:
1

Jochen Arndt

То cbInput параметр из BCryptHashData неправильный:

if(!NT_SUCCESS(status = BCryptHashData(
    hHash,
    (PBYTE)pwTst,
    sizeof(rgbMsg),
    0)))
    {
        goto Cleanup;
    }
cbInput [в]

Количество байтов в буфере pbInput.
Наверное так и должно быть
if(!NT_SUCCESS(status = BCryptHashData(
    hHash,
    (PBYTE)pwTst,
    wcslen(pwTest) * sizeof(wchar_t),
    0)))
{
        goto Cleanup;
}

Это требует, чтобы csText_i это широкая строка с нулевым окончанием. Линия
PCWSTR pwTst = (PCWSTR)csText_i;
позвольте мне предположить, что это не так, потому что в противном случае не было бы никакой необходимости бросать PCWSTR.