AES де / шифрование в C и PHP - PullRequest
0 голосов
/ 31 мая 2019

Так что это код, который я использую в качестве примера

Aes128KeyLength = 128/8;

    //
    // Allocate Key buffer
    //

    Aes128Key = (PBYTE) HeapAlloc( GetProcessHeap(), 0, Aes128KeyLength);
    if( NULL == Aes128Key )
    {
        Status = STATUS_NO_MEMORY;
        ReportError(Status);
        goto cleanup;
    }

    //
    // Derive the AES 128 key from the password 
    // Using PBKDF2
    //

    //
    // Open an algorithm handle
    //

    Status = BCryptOpenAlgorithmProvider(
                                        &KdfAlgHandle,              // Alg Handle pointer
                                        BCRYPT_PBKDF2_ALGORITHM,    // Cryptographic Algorithm name (null terminated unicode string)
                                        NULL,                       // Provider name; if null, the default provider is loaded
                                        0);                         // Flags
    if( !NT_SUCCESS(Status) )
    {
        ReportError(Status);
        goto cleanup;
    }


    //
    // Create a key handle to the password
    //

    Status = BCryptGenerateSymmetricKey(
                                        KdfAlgHandle,               // Algorithm Handle 
                                        &Aes128PasswordKeyHandle,   // A pointer to a key handle
                                        NULL,                       // Buffer that recieves the key object;NULL implies memory is allocated and freed by the function
                                        0,                          // Size of the buffer in bytes
                                        (PBYTE)Aes128Password,      // Buffer that contains the key material
                                        sizeof (Aes128Password),    // Size of the buffer in bytes
                                        0);                         // Flags
    if( !NT_SUCCESS(Status) )
    {
        ReportError(Status);
        goto cleanup;
    }


    //
    // Derive AES key from the password
    //

    Status = BCryptKeyDerivation(
                                        Aes128PasswordKeyHandle,    // Handle to the password key
                                        &PBKDF2Parameters,          // Parameters to the KDF algorithm
                                        Aes128Key,                  // Address of the buffer which recieves the derived bytes
                                        Aes128KeyLength,            // Size of the buffer in bytes
                                        &ResultLength,              // Variable that recieves number of bytes copied to above buffer  
                                        0);                         // Flags
    if( !NT_SUCCESS(Status) )
    {
        ReportError(Status);
        goto cleanup;
    }

Я использую функцию hash_pbkdf2 для того же самого на стороне PHP.в PHP я добавил echo hash_pbkdf2("sha256","PASSWORD", $salt,1000, 16, TRUE);

в чем причина этого?Я пробовал различные стандартные тесты, которые я нашел в Интернете, но результаты все равно не совпадают.Я не могу видеть, где я могу испортить.Для кода на C число итераций равно 1000 вместе с тем же значением на стороне PHP.Все значения, которые я передаю функции, одинаковы на стороне PHP и C.все же вывод на стороне C и PHP производного ключа не совпадает?Что я делаю не так или есть какие-то проблемы с возможностями, о которых мне следует знать?

1 Ответ

0 голосов
/ 31 мая 2019

Кроме упомянутых итераций соль также влияет на сгенерированный ключ.

Ниже я использую одну и ту же соль 'a' / 0x61 в php и C ++ ( sample ).

<?php
$password = "PASSWORD";
$iterations = 1000;
$salt = 'a'; //0x61

$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 16);
echo $hash;
?>

Так что, если вы используете одну и ту жеСоль значение с той, что в CipherEncryptionDecryption.cpp, вы получите тот же результат.

static const
BYTE Salt [] =
{
    0x61
};

Оба дают мне результат:

32f8b5d8c4d1aa1fbb39a0a33338ccb1

...