Показать полную графическую версию : Вопрос по скрипту для генерации паролей.
SoulGood
12-05-2020, 15:34
Доброго времени всем.
Подскажите пожалуйста, как будет выглядеть код батника, если необходимо сгенерировать все возможные пароли без повторов, содержащие данный набор символов и букв:
0123456789abcdefghijklmnopqrstuvwxyz
Длина пароля - 6 букв и цифр.
С сохранением всех сгенерированных паролей в файл.
Перепробовал не один батник. Но то, генерация рандомная по кол-ву цифр, то скрипт генерирует по одному паролю.
Dreamer_UFA
12-05-2020, 16:13
Принципиально батник ?
Есть прекрасные программы для генерации паролей.
Сам юзаю VipNet Password Generator. Посмотрите, может перекроет ваши потребности
SoulGood
12-05-2020, 16:37
Dreamer_UFA, На сколько я понял, в ней нет нужного функционала. За ответ спасибо.
DJ Mogarych
12-05-2020, 17:25
Powershell:
$c = 0
$pass = do {
(get-random (([char[]](0..255) -cmatch '[a-z]' |get-random -Count 3) + `
([char[]](0..255) -cmatch '[0-9]' |Get-Random -count 3)) -count 6) -join ''
$c++
} until ($c -eq 100)
$pass > C:\temp\pass.txt
Foreigner
12-05-2020, 18:48
powershell, правда вне задания (все комбинации перебора строки)
0..99 | foreach { (New-Guid).Guid.Substring(0,6) }
Add-Type -Assembly System.Web
0..99 | foreach { [Web.Security.Membership]::GeneratePassword(6,0) }
Коллеги, не надо ничего «генерировать». Нужно просто составить все возможные комбинации.
megaloman
12-05-2020, 19:44
если необходимо сгенерировать все возможные пароли без повторов » то поставленная задача прктически повторяет эту решенную. (http://forum.oszone.net/thread-345138.html) @Echo Off
Set "S=0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z"
Set /A M=6
Set "FileOut=Z:\Box_Out\FileOut.txt"
Set /A N=10
For %%@ In (a b c d e f g h i j k l m n o p q r s t u v w x y z) Do Set /A N+=1 &Call Set "@V%%N%%=%%%%%%%%@"
Set /A MM=%M%+10
Set "Com="
Set "Rez=Echo "
FOR /L %%$ IN (11,1,%MM%) DO Call Set "Com=%%Com%%For %%@V%%$%% In (%S%) Do " &Call Set "Rez=%%Rez%%%%@V%%$%%"
>"%FileOut%" (%Com%%Rez%)
Exit /B
Упрощенный вариант для 6 символов в строке@Echo Off
Set "Simb=0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z"
Set "FileOut=Z:\Box_Out\FileOut.txt"
>"%FileOut%" (For %%i In (%Simb%) Do For %%j In (%Simb%) Do For %%k In (%Simb%) Do For %%l In (%Simb%) Do For %%m In (%Simb%) Do For %%n In (%Simb%) Do Echo %%i%%j%%k%%l%%m%%n)
Exit /B
Насколько я понимаю, постановка исключает рандомную генерацию паролей: необходимо сгенерировать все возможные пароли. Правда, сколько сотен миллионов строк получится и сколько времени это будет выполняться, подсчитать затрудняюсь.
Лабораторка? :maniac:
Нужно просто составить все возможные комбинации. »
Посчитаем:
powershell
function get-factorial([int]$num = 1) {
switch ($num -le 1) {
$true { $num }
$false {$num*(get-factorial(--$num))}
}
}
# количество комбинаций
$n = '0123456789abcdefghijklmnopqrstuvwxyz'
$m = 6
$C = (get-factorial $n.length)/((get-factorial $m)*(get-factorial ($n.length - $m)))
$C
1947792 - число комбинаций...
Количество потраченного времени будет зависеть от скорости перебора комбинаций.
Допустим, 10 в секунду. Тогда:
$C/10/60/60/24
2,25438888888889 дней непрерывного перебора... как-то так :yes:
megaloman
12-05-2020, 22:10
YuS_2, 1947792 »С комбинаторикой у меня отношения напряженные, но, ИМХО, у Вас вкралась ошибка.
Мы имеем тридцатишестиричную систему исчисления.
Я посчитал тупо: =35*36^0+35*36^1+35*36^2+35*36^3+35*36^4+35*36^5=2 176 782 335
Если в секунду 100000 строк, то 2 176 782 335/100000/60/60=6 час
Строка 6 символов занимает 8 байт. Файл 8*2 176 782 335=17 414 258 680=16Гб
:mail1:
ИМХО, у Вас вкралась ошибка »Вот, можете проверить:Param(
$m=6, # Размер комбинации
$n=36 # Количество используемых элементов
)cls
function Get-Possibility{param($m,$n)$i,$j=1,1
($n-$m+1)..$n|%{$i*=$_};
1..$m|%{$j*=$_} ; $i/$j
}
"Вариантов сочетаний: "+(Get-Possibility $m $n)
#Вариантов сочетаний: 1947792
megaloman
12-05-2020, 23:48
Fors1k_m, так каждый может! Вы мне Мурку сбацайте! Дайте формулу, а не программу.
megaloman
13-05-2020, 00:51
Fors1k_m, давайте упростим задачу: есть символы 0 1 2 3 4 5 6 7 8 9 a b c d e f
То есть имеем 16 цифр стандартной шестнадцатиричной системы.
Всевозможные комбинации этих цифр можно получить элементарным счетом:
000000 000001 000002 ... 00000f 000010 ... ffffff
Возьмите любой калькулятор, который переводит числа из шестнадцатиричной системы в десятичную, и переведите в десятичную число:
ffffff=16 777 215
То есть вот это количество уникальных чисел от 000000 до ffffff
То есть символов (16) гораздо меньше рассматриваемых в предложенной задаче (36), а чисел намного больше, чем насчитали Вы 1 947 792 для бОльшего числа символов. То есть, Ваше число вычислено некорректно.
Похоже, и я ошибаюсь на 1 (не учитываю в подсчете 000000)
Кстати, вот калькулятор, (https://calculatori.ru/perevod-chisel.html) можете там напрямую перевести число ZZZZZZ тридцатишестиричной системы в десятичную.
Кстати, так как мы говорим о паролях, то ab и ba это разные наборы данных, а значит количество возможных уникальных комбинаций здесь будет не 1 947 792, а 1 402 410 240.
Param(
$m = 6, # Размер комбинации
$n = 36 # Количество используемых элементов
)cls
function Get-Possibility($m,$n)
{
$i,$j=1,1;1..$n|%{$i*=$_;}
1..($n-$m)|%{$j*=$_};$i/$j
}
"Вариантов размещений: "+(Get-Possibility $m $n)
Итог:
Замер для(1/1000) 1 402 411 комбинаций показал:Время: 12сек.
Размер файла:10,7MB
Для полного объема вариантов ориентировочно будет:Время: 3ч.20мин
Размер файла:10,45GB
С комбинаторикой у меня отношения напряженные, но, ИМХО, у Вас вкралась ошибка. »
Возможно, делал по памяти, "на скорую руку"... но ошибка, скорее всего, при исправлении, приведет к большим значениям
Дайте формулу, а не программу. »
Например, вот (https://www.mathelp.spb.ru/book2/tv3.htm)
Кстати, так как мы говорим о паролях, то ab и ba это разные наборы данных, а значит количество возможных уникальных комбинаций »
Точно! Вот и ошибка моя нашлась, нам нужны размещения, а не сочетания... :)
function get-factorial([int]$num = 1) {
switch ($num -le 1) {
$true { $num }
$false {$num*(get-factorial(--$num))}
}
}
# количество размещений
$n = '0123456789abcdefghijklmnopqrstuvwxyz'
$m = 6
$A = (get-factorial $n.length)/(get-factorial ($n.length - $m))
$A
1402410240
Замер для(1/1000) »
Где-то в замерах ошибка, ибо:
скорость - 1000 комбинаций в секунду (такая скорость точно реальна?)
1402410240/1000/60/60/24 = 16,2316 дней
скорость - 1000 комбинаций в секунду »Почему 1000 в секунду?) Перебор 1 402 411 Комбинаций занял 12сек.
Скорость=1 402 411 Комбинаций / 12 сек= 116 867 комбинаций в секунду. Но у меня ещё комп очень старый(Intel LGA775), думаю у других побыстрее будет.
Так как 1 402 411 - это одна тысячная от общего количества, то для всех вариантов время=12*1000/60/60=3 часа 20 минут.
Кстати, так как набор символов неисчерпаем, то количество возможных уникальных комбинаций для данной задачи будет не 1 402 410 240, а 2 176 782 336.
Вычисление:Param(
$m=6, # Размер комбинации
$n=36 # Количество используемых элементов
)cls
function Get-FullPossibility($m, $n)
{
$i=$j=$k=$z=1;($n-$m+1)..$n|%{$i*=$_};1..$m|
ForEach{$j*=$_};1..$n|%{$k*=$_;};1..($n-$m)|
ForEach-Object{$z*=$_};$p=[Math]::Pow($n,$m)
Write-Output @{
"Вариантов сочетаний " = ($i/$j)
"Вариантов размещений" = ($k/$z)
"Вариантов размещений с повторами" = $p
}|FT -AutoSize
}
Get-FullPossibility $m $nName Value
---- -----
Вариантов сочетаний 1947792
Вариантов размещений 1402410240
Вариантов размещений с повторами 2176782336
Итог:
Замер для(1/1000) 2 176 783 комбинаций показал:Время: 18сек.
Размер файла:16,6MB
Для полного объема вариантов ориентировочно будет:Время: 5ч.
Размер файла:16,2GB
megaloman
13-05-2020, 10:25
YuS_2, Fors1k_m, Доводим задачу до маразма: набор символов 0123456789, надо посчитать, сколько чисел содержится в диапазоне от 000000 до 999999.
Считаем: раз два три четыре пять .... МИЛЬЁН! (если приплюсовать 000000)
Вот результаты скрипта YuS_2, (цитирую с минимальными изменениями для приведенного случая): function get-factorial([int]$num = 1) {
switch ($num -le 1) {
$true { $num }
$false {$num*(get-factorial(--$num))}
}
}
# количество размещений
$n = '0123456789'
$m = 6
$A = (get-factorial $n.length)/(get-factorial ($n.length - $m))
$A=151200
Если на клетке слона прочтешь надпись: буйвол, — не верь глазам своим.
Кстати, если длина строки =2 (00 - 99) Ваш скрипт декларирует 90. - что-то в консерватории надо менять.
Мой суперноут 2007 года выпуска по скрипту @Echo Off
rem Set "Simb=0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z"
Set "Simb=0 1 2 3 4 5 6 7 8 9"
Set "FileOut=Z:\Box_Out\FileOut.txt
>"%FileOut%" Echo %time%
>>"%FileOut%" (For %%i In (%Simb%) Do For %%j In (%Simb%) Do For %%k In (%Simb%) Do For %%l In (%Simb%) Do For %%m In (%Simb%) Do For %%n In (%Simb%) Do Echo %%i%%j%%k%%l%%m%%n)
>>"%FileOut%" Echo %time%
Exit /B
выдал результат:9:58:10,67
000000
000001
000002
......
999997
999998
999999
9:58:46,80
То есть, 1 000 000/36=28 000 строк/сек и мои отпотолочные предположения о 100 000 строк/сек не такие уж невероятные, а то и весьма скромныеFors1k_m, Ура, конСЕКСус! 2 176 782 336 »
1947792 - число комбинаций... »
megaloman прав, вы посчитали размещение без повторений - количество вариантов перемешать символы в строке
впрочем, я опоздал со своим комментарием
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.