11.06.2004 13:37:45Какая связь между секретным ключом пользователя и паролем ? Ответов: 4
Дмитрий
Господа, я немного запутался.
Через ваш тестовый центр я успешно получил тестовый ключ(на дискете).
И я прямо теряюсь в догадках, какая его роль.
Опрос этого ключа происходит при вызове функции CryptAcquireContext.
Затем задается пароль в функции CryptHashData и далее данные шифруются.
Если я задам другой пароль, то данные зашифруются по другому.
То есть на результат шифрования влияет значение пароля(историю с инициализирующим вектором пропустим).

И вопрос-то у меня вот какой: для чего мне нужен ключ на дискете и как он влияет на результат шифрования.
 
Ответы:
11.06.2004 14:15:51Василий
Тысяча извинений, но где же в функции
CryptHashData можно задать пароль?
Вот что пишут в MSDN:
BOOL WINAPI CryptHashData(
HCRYPTHASH hHash,
BYTE* pbData,
DWORD dwDataLen,
DWORD dwFlags
);

Parameters
hHash
[in] Handle of the hash object.
pbData
[in] Pointer to a buffer containing the data to be added to the hash object.
dwDataLen
[in] Number of bytes of data to be added. This must be zero if the CRYPT_USERDATA flag is set.
dwFlags
[in] The following flag value is defined.
Value:
CRYPT_USERDATA
Meaning:
All Microsoft Cryptographic Providers ignore this parameter. For any CSP that does not ignore this parameter, if this flag is set, the CSP prompts the user to input data directly. This data is added to the hash. The application is not allowed access to the data. This flag can be used to allow the user to enter a PIN into the system.
11.06.2004 14:43:42Дмитрий
Василий, извинения принимаются ;)

Хорошо, я выскажусь по другому.
Я хэширую пароль, используя функцию CryptHashData(). Затем создаю ключ на основании хэша пароля функцией CryptDeriveKey.
Затем полученный ключ передаю в функцию CryptEncrypt.

И, как я уже сказал, у меня вопрос: для чего мне нужен ключ на дискете и как он влияет на результат шифрования?
11.06.2004 15:39:44Вадим
Через CryptDeriveKey Вы получаете симметричный ключ, а на дискетке у Вас лежит ключевая пара для ассиметричного шифрования.
11.06.2004 15:40:44Василий
Ок, теперь понятно.
Шифрование всегда производится на симметричном сессионном ключе, который никогда не хранится в контейнере. Расшифрование производится на том же ключе. Если Вы делаете ключ из пароля, то, и для расшифрования можете делать ключ так же. НО! Операция не рекомендуемая, т.к. стойкость криптоалгоритма будет держаться только на сложности пароля. Грубо говоря, пароль сравнительно легко подобрать.
Рекомендуемая схема такая:
1) Симметричный ключ генерится случайным (функцией CryptGenKey(..CALG_G28147..))
2) на этом ключе шифруются данные
3) делается ключ парной связи по алгоритму Диффи-Хеллмана из своего закрытого ключа (из своего контейнера) и чужого открытого (из сертификата)
4) сессионный ключ шифруется на ключе обмена
5) приемной стороне передаются зашифрованные данные и зашифрованный ключ
6) на приемной стороне делается ключ ДХ (из других половинок), расшифровывается сессионный ключ, а затем - данные.
Не забудьте ещё о синхровекторе ключа для правильного расшифрования.
Пример см. http://www.cryptopro.ru/CryptoPro/forum/answer.asp?q=4