26.01.2006 19:34:59Как перевеси mcrypt_generic_init на рельсы CryptoAPI ? Ответов: 2
avkiev
Как перевести следующий фрагмент на CryptoAPI ?
#include <mcrypt.h>
mtd = mcrypt_module_open ("rijndael-128", NULL, "cbc", NULL);
rc = mcrypt_generic_init (mtd, key, 16, iv);

Делаю так:
1. CryptAcquireContext CSP, 0, 0, PROV_RSA_AES, 0 - Открыли CSP
2. CryptCreateHash CSP, CALG_MD5, 0, 0, Hash - создаем ХЕШ. Кстати, какой надо ? MD5 ли ?
3. CryptHashData Hash, key(0), 16, 0 - Хешируем начальное значение ключа. Наверняка это не верно...
4. CryptDeriveKey CSP, CALG_AES_128, Hash, 0, AESKey - Создаем AES-ключ по хешу
5. CryptDestroyHash Hash - убиваем ХЕШ
6. CryptSetKeyParam AESKey, 1, iv(0), 0 - Устанавливаем AES-ключу Инициализирующий вектор
7. CryptEncrypt AESKey, 0, 1, 0, buffer(0), dwBlockLen, dwBufferLen - Шифруем буфер

Проблема - во 2 и 3-й строке. Написал их от фонаря.
Не понимаю - как корректно использовать KEY при создании AESKey.
Путем его хеширования MD5 и генерации AES-KEY по этому хешу ? Или как ?

Заранее благодарен
 
Ответы:
26.01.2006 20:49:29maxdm
Примерно так, только перед созданием ключа вызвать CryptGenRandom и захэшировать полученую последовательность. Или нужно использовать существующий ключ?
27.01.2006 10:24:23avkiev
Да, в том и проблема, что мне нужно создать точно такой же ключ, который создается по команде
mtd = mcrypt_module_open ("rijndael-128", NULL, "cbc", NULL);
rc = mcrypt_generic_init (mtd, key, 16, iv);
(KEY и IV - известные 16-байтовые массивы).

Иными словами: MTD - это функция двух переменных (KEY и IV).
Как при генерации моего ключа использовать IV - я знаю:
CryptSetKeyParam AESKey, KP_IV, iv(0), 0 - Устанавливаем AES-ключу Инициализирующий вектор

А вот как использовать KEY ?