Кодирование Openssl / libcrypto AES 128 с использованием KEY - PullRequest
1 голос
/ 02 августа 2011

Я шифрую определенную строку с помощью AES-128-ECB, а затем сохраняю результат в файле, например test.enc. Вот мой метод шифрования:

int do_crypt(char *outfile) {
unsigned char outbuf[1024];
int outlen, tmplen;
unsigned char key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
char intext[] = "Some Text";
EVP_CIPHER_CTX ctx;
FILE *out;
EVP_CIPHER_CTX_init(&ctx);

EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, key, NULL);
if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, intext, strlen(intext))) {
    /* Error */
    return 0;
}
/* Buffer passed to EVP_EncryptFinal() must be after data just
 * encrypted to avoid overwriting it.
 */
if(!EVP_EncryptFinal_ex(&ctx, outbuf + outlen, &tmplen))
{
    /* Error */
    return 0;
}
outlen += tmplen;
EVP_CIPHER_CTX_cleanup(&ctx);
/* Need binary mode for fopen because encrypted data is
 * binary data. Also cannot use strlen() on it because
 * it wont be null terminated and may contain embedded
 * nulls.
 */
out = fopen(outfile, "wb");
fwrite(outbuf, 1, outlen, out);
fclose(out);
return 1;

}

Как видите, ключ является действительным паролем, и для декодирования зашифрованного файла должна быть выполнена следующая командная строка:

openssl aes-128-ecb -in test.enc -K 000102030405060708090A0B0C0D0E0F -d

"000102030405060708090A0B0C0D0E0F" - это шестнадцатеричное представление пароля, которое я использую в приведенном выше коде0123456789191112131415. Как я понимаю, пароль может быть также зашифрован с использованием алгоритма MD5.

Вопрос в том, как зашифровать данные, используя фактический ключ KEY, полученный из пароля, а не сам пароль, используя libcrypto?

1 Ответ

2 голосов
/ 02 августа 2011

Взгляните на EVP_BytesToKey .

Мои комментарии в старом приложении говорят мне, что BytesToKey устарел, и вам, возможно, стоит рассмотреть вопрос о PKCS5_v2_PBE_keyivgen или аналогичном.Но, по сути, очень упрощенный способ сделать это - вы извлекаете ключ в виде хэша из вашего пароля и подходящего солт-значения:

EVP_DigestInit_ex(...)
EVP_DigestUpdate(...Password...)
EVP_DigestUpdate(...Salt...)
EVP_DigestFinal_ex(...)

, затем вы используете вновь сгенерированный ключ для получения вашего IV с помощью:

EVP_DigestInit_ex(...)
EVP_DigestUpdate(...Key...)
EVP_DigestUpdate(...Password...)
EVP_DigestUpdate(...Salt...)
EVP_DigestFinal_ex(...)

Просмотр исходного кода OpenSSL наиболее полезен для поиска подобных вещей.

Отказ от ответственности: я не программист на C (рассматриваемое приложение было Delphi, использующее DLL-библиотеки OpenSSL) ни эксперт по безопасности, так что примите эти предложения в качестве отправной точки, прочитайте соответствующие документы и по возможности используйте надлежащие функции !! ...

...