char szSymbols[PSWD_SYMBOLS_COUNT] = { '0', '1', ... , 'A', ..., 'z' };
for (i = 0; i < 16; i++)
{
szPswd = szSymbols[szPswd % PSWD_SYMBOLS_COUNT];
}
Функция для генерации паролей
Есть ли в Win32 API функция для генерации паролей? Или, вернее, где ее найти?
Нет. Можно самому написать, используя rand() или какие-либо случайне события(мышка, клава, число тактов). Можно взять готовую, например из
Побродил по MSDN по разделу "Win32 and COM development" > "Security" > "Cryptography" и нашел функцию CryptGenRandom(), которая заполняет буфер "криптографически случайными байтами". Попробую использовать ее.
так она сгенерит байты из диапозона 0-255, а для пароля это не подходит
Код:
szPswd : 0 - 255. Если 256 % PSWD_SYMBOLS_COUNT != 0, то какие-то символы будут встречаться чаще других, а именно - первые в списке.
Интересно, почему? Если не сложно, то может укажешь свои соображения? Или это из раздела теории вероятностей или математической статистики?
Цитата: Tirpitz
Интересно, почему? Если не сложно, то может укажешь свои соображения?
Валидных символов у нас: от 0 до 9 - 10, от a до z - 26 + в верхнем регистре. Итого 10 + 26 + 26 = 62. ГПСЧ возвращает нам набор из из чисел в интервале от 0 до 255. Если мы будем пользоваться операцией взятия остатка (модулем), то оцените сами - у нас первые числа будут встречаться чаще, так как эта операция как бы "зацикливает" набор чисел и "хвост" цикла будет попадать какраз на первые символы.
Задачу корректнее решать используя отображение интервала [0, 255] в интервал [0, 61] (преобразовывать больший интервал в меньший можно - это не уменьшает энтропию) Т.е. используем формулу:
index = round(rnd_index * (61.0 / 255.0))
По поводу генерации. В принципе в простом случае подойдет и то, что предложил hardcase и rand() (например, моэно добавить модификации: на 5-9-15 символах переинициализировать засчет системного времени или числа тактов или еще чего-нибудь).
Если же последовательность нужна серьезнее, то тогда лучше использовать пул энтропии, постоянно поддерживая его в актуальном состоянии. А уже данные из него использовать для генерации случайной последовательности. Реализаций много, так что найти пример не составит проблемы.
Понял: если диапазон случайных чисел от 0 до 255 (всего 256), а количество допустимых символов в пароле - 83, то имеем: 256 = 83 * 3 + 7. Т.е. при делении индекса большего интервала (0...255) по модулю 83, получим что каждый из индексов мешьшего интервала (0...82) встретится ровно три раза плюс еще по одному разу встретятся семь первых индексов меньшего интервала.
Пробовал также и "отображать интервалы" - умножать индекс на коэффициент 82/256 и округлять до ближайшего целого (не до ближайшего меньшего целого, а именно по математическим правилам). В итоге - все индексы повторяются ровно три раза за исключением опять же семи (которые, правда, теперь разбросаны внутри интервала), встретившихся четыре раза, и индекса 0 - встретившегося два раза.
Если вас все же не устраивает использования пула энтропии или невозможно снизить чилсо возможных символов до числа кратного 256. То как вариант могу предложить это. Пусть при выпадении числа от 0 до 248 (83*3 - 1) выбирается соответствующий символ из 83. если выпадет от 249 до 255 выбирается любой символ из 83, например, с помощью ранд. Тогда с вероятностью 249/256 выпадает один из трех символов и с вероятностью 7/256 мы проводим выборку еще раз. При такой комбинации 7 символов опять будут чаще других встречаться, но при этом каждый раз разные.
82/256 - это опечатка. Конечно, 82/255. Просто интересно было сравнить результаты деления по модулю и "отображения интервалов" именно в моем случае с моими исходными данными.