![]() |
Вопрос по скрипту для генерации паролей.
Доброго времени всем.
Подскажите пожалуйста, как будет выглядеть код батника, если необходимо сгенерировать все возможные пароли без повторов, содержащие данный набор символов и букв: 0123456789abcdefghijklmnopqrstuvwxyz Длина пароля - 6 букв и цифр. С сохранением всех сгенерированных паролей в файл. Перепробовал не один батник. Но то, генерация рандомная по кол-ву цифр, то скрипт генерирует по одному паролю. |
Принципиально батник ?
Есть прекрасные программы для генерации паролей. Сам юзаю VipNet Password Generator. Посмотрите, может перекроет ваши потребности |
Dreamer_UFA, На сколько я понял, в ней нет нужного функционала. За ответ спасибо.
|
Powershell:
Код:
$c = 0 |
powershell, правда вне задания (все комбинации перебора строки) Код:
0..99 | foreach { (New-Guid).Guid.Substring(0,6) } Код:
Add-Type -Assembly System.Web |
Коллеги, не надо ничего «генерировать». Нужно просто составить все возможные комбинации.
|
Цитата:
Вот та задача с выводом результатов в файл и с Вашим набором символов.
Код:
@Echo Off Код:
@Echo Off Лабораторка? :maniac: |
Цитата:
powershell Код:
function get-factorial([int]$num = 1) { Количество потраченного времени будет зависеть от скорости перебора комбинаций. Допустим, 10 в секунду. Тогда: Код:
$C/10/60/60/24 |
YuS_2,
Цитата:
Мы имеем тридцатишестиричную систему исчисления. Я посчитал тупо: =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( |
Fors1k_m, так каждый может! Вы мне Мурку сбацайте! Дайте формулу, а не программу.
|
Вложений: 1
Цитата:
|
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) Кстати, вот калькулятор, можете там напрямую перевести число ZZZZZZ тридцатишестиричной системы в десятичную. |
Кстати, так как мы говорим о паролях, то ab и ba это разные наборы данных, а значит количество возможных уникальных комбинаций здесь будет не 1 947 792, а 1 402 410 240.
Вычисление
Код:
Param( Итог: Замер для(1/1000) 1 402 411 комбинаций показал: Время: 12сек.Для полного объема вариантов ориентировочно будет: Время: 3ч.20мин |
Цитата:
Цитата:
Цитата:
Код:
function get-factorial([int]$num = 1) { |
Цитата:
скорость - 1000 комбинаций в секунду (такая скорость точно реальна?) 1402410240/1000/60/60/24 = 16,2316 дней |
Цитата:
Скорость=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( Код:
Name Value Замер для(1/1000) 2 176 783 комбинаций показал: Время: 18сек.Для полного объема вариантов ориентировочно будет: Время: 5ч. |
YuS_2, Fors1k_m,
Следите за руками, никакого мошенничества!
Доводим задачу до маразма: набор символов 0123456789, надо посчитать, сколько чисел содержится в диапазоне от 000000 до 999999.
Считаем: раз два три четыре пять .... МИЛЬЁН! (если приплюсовать 000000) Вот результаты скрипта YuS_2, (цитирую с минимальными изменениями для приведенного случая): Код:
function get-factorial([int]$num = 1) { Если на клетке слона прочтешь надпись: буйвол, — не верь глазам своим. Кстати, если длина строки =2 (00 - 99) Ваш скрипт декларирует 90. - что-то в консерватории надо менять. Мой суперноут 2007 года выпуска по скрипту Код:
@Echo Off Код:
9:58:10,67 Цитата:
|
Цитата:
впрочем, я опоздал со своим комментарием |
|
Busla, а вот тут вопрос — как именно трактовать авторское:
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
При анализе, достаточно ясно вырисовывается картинка, что за основу расчетов была взята формула не предполагающая наличие повторов символов, в этом моя ошибка. В общем, формула выбрана неверно, следовательно, количество допустимых Смотрим: Код:
function get-factorial([int]$num = 1) { Козьма Прутков, конечно же, совершенно прав. :) Цитата:
Цитата:
Ну да и пусть тоже будет... Цитата:
Поэтому, видимо и требуются все варианты... |
Цитата:
Так, например, код из поста 5 Цитата:
Код:
$pass=0..1296 | foreach { (New-Guid).Guid.Substring(0,2) } Цитата:
Набор символов - материальные шары в корзине. Если мы взяли шар с буквой 'a' в качестве первого символа, то в корзине его больше нет, и на месте второго символа он уже не окажется. Так мы получим 1 402 410 240 вариантов. Неисчерпаемый пул: Набор символов - набор символов в переменной. Если мы взяли букву 'a' в качестве первого символа, то из переменной она никуда не пропадает, следовательно имеет возможность оказаться на месте и второго символа. Так мы получим 2 176 782 336 вариантов. |
Цитата:
|
Fors1k_m
Цитата:
Код:
0..1296 | % { (New-Guid).Guid.Substring(0,6) } | group | ? Count -gt 1 |
Цитата:
Так что либо нужно считать для комбинаций из двух: Код:
cls;0..1296 | % { (New-Guid).Guid.Substring(0,2) } | group | ? Count -gt 1 Код:
cls;0..12960 | % { (New-Guid).Guid.Substring(0,6) } | group | ? Count -gt 1 |
Код:
cls;0..12960 | % { (New-Guid).Guid.Substring(0,6) } | group | ? Count -gt 1 Код:
Count Name Group |
Цитата:
12961 вариант из шести символов выдал три повтора, две сотых процента. Но это важно вообще? Возьми из массива только уникальные елементы. |
Pади интереса:
Код:
0..12960 | % { (get-random $([char[]]'0123456789abcdefghijklmnopqrstuvwxyz') -count 6) -join '' } | group | ? count -gt 1 |
Цитата:
1. Я уже говорил о фундаментальном смысле уникальности паролей. 2. Такую задачу четко поставил автор:
Цитата:
Цитата:
Pади интереса: Код:
$rep=0;$k=0 Код:
Первый повтор встречается на 11 попытке |
Цитата:
Вот решение "в лоб" для 6 символов в строке
Код:
@Echo Off Для отладки брал набор из 10 символов. Результат:
Код:
20:05:18,03 Вообще-то задача достаточно бессмысленая, разве что как лаба. Практически надо генерировать пароль рандомным образом для каждого конкретного случая, и вероятность того, что пароли совпадут, достаточно низкая |
Цитата:
Код:
@echo off |
Цитата:
Код:
param( |
Цитата:
для [Powershell.CSharp]::Combinations(6,10) TotalMilliseconds : 72,4355 |
Цитата:
На моём суперкомпе Ваш код делается 13', мой - 17', слегка его соптимизировал - 9' Демонстрирую:
Код:
@Echo Off |
Прямой перебор по индексу:
Код:
Код:
0 139 > measure-command { .\2 } |
Цитата:
Ошибка в первом for: Цитата:
Кстати, что бы не писать все время -1, можно исользовать -lt: Код:
for ($c0 = 0; $c0 -lt $x.count; $c0++) |
Fors1k_m,
Вы код поправьте. Выдает ворох ошибок:
Код:
C:\Users\user\Desktop\3.ps1:16 знак:22 |
Цитата:
У megaloman тоже работает: Цитата:
|
У меня тоже был ворох ошибок, обновил PowerShell до 5.1
|
Вложений: 1
megaloman: Цитата:
Код:
$host.version.tostring() Код:
$host.version.tostring() |
Цитата:
для чисел, есть более быстродействующее решение... Цитата:
У него много оптимизаций было... и циклы там работают быстрее, примерно в 2 раза |
Цитата:
А то, что есть способы быстрее, то кто бы спорил. |
Цитата:
Тем не менее, Ваш способ достаточно интересный, возьму "на вооружение" :) |
Цитата:
Запустите с буквенно-цифровым вариантом, разницы нет, зависит только от количества циклов: Скрытый текст
Код:
$cmb = 4 PS. Не претендую на самый быстрый и логически правильный вариант |
Цитата:
Вот ещё вариант ... правда он чуть медленнее, хоть и с одним циклом всего. Код:
param ( |
Ну и напоследок, победитель нашего конкурса генераторов прямого перебора :) :yes: :
Код:
param( |
YuS_2, подозреваю, что на чистом C, без .Net, будет ещё шустрее.
|
Цитата:
|
Ну и совсем напоследок, абсолютный победитель нашего конкурса генераторов прямого перебора :clever-ma :dance: :
Код:
param( еще
'abcdefghij0123' = 1,978599
'0123456789abcdefghij' = 17,4350418 |
Из любопытства сравнил на своём ноуте:
скрипт PS Fors1k_m скрипт PS YuS_2 скрипт CMD Megaloman макрос VBA Excel скрипт Vbs Код:
6-0123456789 VBS (vba) прямой перебор
Код:
'Sub rrr2() VBS генератор строк с уникальными символами
Код:
'Sub rrr() |
Цитата:
Цитата:
при прочих равных, PS 5.1 TotalSeconds : 4,5936197 TotalSeconds : 1,049038 быстрее в 4,6 раз для '0123456789abcdefghij' TotalSeconds : 306,0904845 TotalSeconds : 42,464878 быстрее в 7,2 раз т.е. с увеличением числа символов целевого набора, разница существенно возрастает... а по сути: 64000000 - 42,5сек считаем для 36 - 6: 2176782336 - 1445 сек/60= 24 мин. уже более-менее вменяемый результат, который можно ещё ускорить, если использовать железо получше и PS v7.0 для 10^6 в PS 7.0 TotalSeconds : 3,4414547 TotalSeconds : 0,5906468 для 64000000 в PS 7.0 TotalSeconds : 214,1145746 TotalSeconds : 25,2777355 - как-то так... файл, кстати, получается 488,2Мб Цитата:
|
|
|
Цитата:
Интересно увидеть результат у кого-нибудь на современном пк. Цитата:
10^6 = 2,1835635 36^6 = 391,1104797 VBS (vba) от megaloman, на моем железе: 10^6 = 3,387438 |
Цитата:
|
Цитата:
Запустил еще раз: 10^6 = 0,2484363 |
Время: 08:49. |
Время: 08:49.
© OSzone.net 2001-