Эквивалент Rfc2898DeriveBytes в C ++ без использования CLR - PullRequest
1 голос
/ 06 марта 2019

Что является альтернативой Rfc2898DeriveBytes в C ++ без использования CLR.Образец C # представлен ниже.

string clearText="text to sign";
string EncryptionKey = "secret";
byte[] clearBytes = Encoding.UTF8.GetBytes(clearText);
using (Aes encryptor = Aes.Create())
{
    Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x48, 0x71, 0x21, 0x6d, 0x21, 0x4c, 0x61, 0x62, 0x72, 0x62, 0x61, 0x62, 0x72 });
    encryptor.Key = pdb.GetBytes(32);
    encryptor.IV = pdb.GetBytes(16);
    using (MemoryStream ms = new MemoryStream())
    {
        using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
        {
            cs.Write(clearBytes, 0, clearBytes.Length);
            cs.Close();
        }
        clearText = Convert.ToBase64String(ms.ToArray());
    }
}

1 Ответ

1 голос
/ 06 марта 2019

Вы можете использовать PKCS5_PBKDF2_HMAC в OpenSSL.

Обе эти функции являются PBKDF2 и могут использоваться взаимозаменяемо.

Обновление:

Вот пример кода для генерации аналогичных ключей в C# и OpenSSL.

C# сторона:

public static void Main()
{
    string EncryptionKey = "secret";
    Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x48, 0x71, 0x21, 0x6d, 0x21, 0x4c, 0x61, 0x62, 0x72, 0x62, 0x61, 0x62, 0x72 }, 1000);
    Console.WriteLine("[{0}]", string.Join(", ", pdb.GetBytes(32)));
    Console.WriteLine("[{0}]", string.Join(", ", pdb.GetBytes(16)));
}

OpenSSL сторона:

#include <openssl/evp.h>
#include <string.h>
#include <stdlib.h>

int main(){
        char secret[] = "secret";
        unsigned char buf[48] = {0,};
        int size = 48;
        unsigned char salt[] = { 0x48, 0x71, 0x21, 0x6d, 0x21, 0x4c, 0x61, 0x62, 0x72, 0x62, 0x61, 0x62, 0x72 };
        PKCS5_PBKDF2_HMAC(secret, strlen(secret), salt, sizeof(salt), 1000, EVP_sha1(), size, buf);
        for (int i = 0; i < size; i++)
                printf("%d ", buf[i]);
        return 0;
}

Просто помните, что в этих кодах итераций всего 1000, используйте не менее 100 000 или даже1000000.

...