Поэтому я знаю, что создание пароля следующим образом - плохая идея. Я бы сказал, что у него всего несколько (например, 5 или около того) битов энтропии, но я не могу правильно ее рассчитать.
Может ли кто-нибудь показать мне, как рассчитать среднее количество попыток, необходимых для угадывания пароля длины n, сгенерированного следующим образом с использованием Oracle JDK 7?
Я предполагаю, что релевантными факторами являются:
- размер алфавита (62–5 для ограничения символов, выглядящих запутанными),
- двухэтапный процесс для выбора класса персонажа, а затем персонажа,
- округление до целого числа,
- пробовать до успеха способ выборки символов,
- внутренние свойства Math.random().
Но я не могу получить точные цифры.
char[] generate(int n) {
char[] pw = new char[n];
for (int i = 0; i < n; i++) {
int c;
while (true) {
c = randomCharacter(c);
if (c == '0' || c == 'O' || c == 'I' || c == '1' || c == 'l')
continue;
else
break;
}
pw[i] = (char) c;
}
return pw;
}
int randomCharacter(int c) {
switch ((int) (Math.random() * 3)) {
case 0:
c = '0' + (int) (Math.random() * 10);
break;
case 1:
c = 'a' + (int) (Math.random() * 26);
break;
case 2:
c = 'A' + (int) (Math.random() * 26);
break;
}
return c;
}
Math.random
зависят от его реализации. Вы не указали ни одного. Вы даже не указали язык (я думаю, Java). - person CodesInChaos   schedule 05.03.2014