Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> в класс генератора паролей добавить отправную точк 
:(
    Опции темы
NetFlame
  Дата 5.8.2008, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.3.2006
Где: Москва

Репутация: нет
Всего: нет



Здравствуйте.

Есть скрипт, который посимвольно перебирает, ну, например, пароль:

gen.class.php
Код

<?
class CPasswordGenerator{
    /**
     * @desc минимальная длина генерируемого пароля
     * @access private
     */
    var $_minlen = 0;
    
    /**
     * @desc максимальная длина генерируемого пароля
     * @access private
     */    
    var $_maxlen = 0;
    
    /**
     * @desc символы, из которых должен состоять пароль
     * @access private
     */
    var $_alphabet = "";
    
    /**
     * @desc текущий вариант пароля
     * @access private
     */
    var $_curPwd = "";
    
    /**
     * @desc массив с числами, соответствующими буквам алфавита
     * @access private
     */
    var $_curPwdAr = array();

    /**
     * @desc текущая длина пароля
     * @access private
     */
    var $_curPwdLen = 0;
    
    /**
     * @desc вариант последнего пароля при заданной длине и алфавите
     * @access private
     */
    var $_lastPwd = "";
    
    /**
     * @desc
     * @access private
     */
    var $_index = 0;
    
    /**
     * @desc длина алфавита
     * @access private
     */
    var $_alphaLen = 0;

    /**
     * @desc длина алфавита минус один, чуток ускоряет генерацию
     * @access private
     */    
    var $_intAlphaLen = 0;
    
    /**
     * Конструктор
     * @access public
     * @param int минимальная длина пароля
     * @param int максимальная длина 
     * @param string алфавит
     * @return void
     */
    function CPasswordGenerator($minLength, $maxLength, $alphabet)
    {
        $this->_minlen      = $minLength;
        $this->_maxlen      = $maxLength;
        $this->_alphabet    = $alphabet;
        $this->_alphaLen    = strlen($this->_alphabet);
        $this->_intAlphaLen = $this->_alphaLen - 1;
        
        $this->_init($this->_minlen);
    }
    
    /**
     * Производит инициализацию
     * @access private
     * @return bool true-успешно, false-неудача
    */
    function _init($len)
    {
        if (!strlen($this->_alphabet)) 
        {
            trigger_error("Alphabet is empty");
            return false;
        }
        if(!($this->_minlen <= $len && $len <= $this->_maxlen))
        {
            //trigger_error("Password length isn't correspond for its conditions");
            return false;
        }
        
        //генерируем последний вариант пароля
        //и заполняем таблицу для бэктрекинга (backtracking)
        $this->_curPwdLen = $len;
        $this->_index      = 0;
        $this->_curPwdAr  = array();
        $this->_curPwd    = "";
        $this->_lastPwd   = "";
        for($i = 0; $i < $len; $i++)
        {
            $this->_lastPwd       .= $this->_alphabet[$this->_alphaLen - 1];
            $this->_curPwd        .= "a"; //может стоять любой символ
            $this->_curPwdAr[$i]   = -1;
        }
        $this->_curPwdAr[$len] = $this->_alphaLen;
        
        return true;
    }
    
    /**
     * Генерирует пароль
     * @access public
     * @param &string переменная, куда будет записан пароль
     * @return bool true-пароль успешно сгенерирован, false-все варианты исчерпаны
    */
    function getNext(&$pwd)
    {
        if($this->_curPwd == $this->_lastPwd)
        {
            if (!$this->_init($this->_curPwdLen + 1)) return false;
        }
        
        while($this->_index >= 0)
        {
            while($this->_curPwdAr[$this->_index] < $this->_intAlphaLen)
            {
                $this->_curPwdAr[$this->_index] += 1;
                $this->_curPwd[$this->_index]    = $this->_alphabet[$this->_curPwdAr[$this->_index]];
                $this->_index++;
                
                if($this->_index == $this->_curPwdLen)
                {
                    $pwd = $this->_curPwd;
                    return true;
                }
            }
            if($this->_index != $this->_curPwdLen) $this->_curPwdAr[$this->_index] = -1;
            $this->_index--;
        }
    }
}
?>



index.php
Код

<?
include("gen.class.php");
$pwdgen = new CPasswordGenerator(1, 3, "abcxyz123");
while($pwdgen->getNext($pwd))
{
    print "$pwd\n";
}
?>


Так как в этом скрипте отсутствует "случайность" генерирования, мне нужно добавить к этому скрипту "начальную точку отправления".
Приведу пример.

Запускаем скрипт. Он нам выдаст:


a
b
c
x
y
z
1
2
3
ab
ac
ax
ay
az
a1
a2
a3
...


Изменим функцию инициализации класса, и добавим в неё "отправную точку", например, возьмём ac:
Код

$pwdgen = new CPasswordGenerator(1, 3, "abcxyz123", "ac");


в результаты выполнения, должно получиться следующее:


ac
ax
ay
az
a1
a2
a3
...


То есть мы говорим скрипту, с какой точки нам начинать.
Как это сделать?

Заранее спасибо.


PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0795 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.