Простейший генератор паролей в Ruby

19 Дек
2011

image

Все мы пытаемся так или иначе защитить свои данные и информацию о себе. В данной статье я расскажу, как сделать простейший генератор паролей на языке Ruby.

Итак, начнем.



Первый шаг



Сначала мы разберемся, как наш генератор должен работать. Я выбрал слегка необычный метод. Пользователь пишет фразу или слово, которое легко запоминается ему (например девичья фамилия матери) и пишет ключ из 5 цифр, по которому и будет идти изменение первой фразы.

Второй шаг



Теперь напишем алгоритм работы генератора:

  1. Ввод фразы
  2. Ввод ключа
  3. Работа программы:
    • Сопоставление размеров пароля и ключа
    • Перекодировка
    • Вывод


Шаг третий



Для начала, подгрузим файл с функциями (он нам пригодится позже) и попросим ввести пароль и ключ:

load "func.rb"

key = ""
pass = ""
while (pass == "")
puts "Напишите фразу для шифрования:"
pass = gets.strip
end
while (key.class != Fixnum and key.class != Bignum)
puts "Напишите ключ для шифрования:"
key = gets.strip.to_i
end


За одно, идет проверка заполнения данных переменных. Думаю, что этот кусок кода всем понятен.

Дальше, убираем лишние знаки в пароле (у меня это только пробелы), и вносим еще одну переменную, которая будет текстовым аналогом нашего ключа:

pass.gsub!(" ","")
key_s = key.to_s


Следующим шагом, мы проверяем размеры наших переменных, ведь если не в ключене останется символов, то пароль будет однородным:

if (pass.length > key_s.length)
key_s *= (pass.length/key.to_s.length + 1)
end


Тут я просто копирую строку нужное количество раз, чтобы сравнять с размером пароля.

И последним шагом будет вызов метода(функции), который будет побуквенно кодировать наш пароль:

puts
puts "Ваш пароль:"
pass.length.times do |time|
secure(key_s[time],pass[time])
end


Шаг четвертый



Теперь займемся кодированием:

Создадим метод, который будет выполнять определенные изменения при определенных условиях:

def secure(number,text)

end


сейчас в нем ничего нет, но мы это изменим. Так как ключ у нас числовой, то вариантов всего десять: от единицы до нуля:

def secure(number,text)
if (number == "1")
elsif (number == "2")
elsif (number == "3")
elsif (number == "4")
elsif (number == "5")
elsif (number == "6")
elsif (number == "7")
elsif (number == "8")
elsif (number == "9")
else
end
end


Теперь добавим деление 3 типа:

def secure(number,text)
if (number == "1")
if (text =~ /[a-zа-я]/)
print "."
elsif (text =~ /[A-ZА-Я]/)
print ","
elsif (text =~ /[0-9\s\S]/)
print "!"
end
elsif (number == "2")
...
elsif (number == "9")
else
end
end


Я не парился на счет символов, которые будут выступать как замена, просто ставил первый, который приходил на ум.

Финиш



Главный файл (main.rb):

load "func.rb"

key = ""
pass = ""
while (pass == "")
puts "Напишите фразу для шифрования:"
pass = gets.strip
end
while (key.class != Fixnum and key.class != Bignum)
puts "Напишите ключ для шифрования:"
key = gets.strip.to_i
end

pass.gsub!(" ","")
key_s = key.to_s

if (pass.length > key_s.length)
key_s *= (pass.length/key.to_s.length + 1)
end

puts
puts "Ваш пароль:"
pass.length.times do |time|
secure(key_s[time],pass[time])
end


И файл с функциями (func.rb):

def secure(number,text)
if (number == "1")
if (text =~ /[a-zа-я]/)
print "."
elsif (text =~ /[A-ZА-Я]/)
print ","
elsif (text =~ /[0-9\s\S]/)
print "!"
end
elsif (number == "2")
if (text =~ /[a-zа-я]/)
print "t"
elsif (text =~ /[A-ZА-Я]/)
print "e"
elsif (text =~ /[0-9\s\S]/)
print "x"
end
elsif (number == "3")
if (text =~ /[a-zа-я]/)
print "*"
elsif (text =~ /[A-ZА-Я]/)
print "_"
elsif (text =~ /[0-9\s\S]/)
print "G"
end
elsif (number == "4")
if (text =~ /[a-zа-я]/)
print "q"
elsif (text =~ /[A-ZА-Я]/)
print "Q"
elsif (text =~ /[0-9\s\S]/)
print "8"
end
elsif (number == "5")
if (text =~ /[a-zа-я]/)
print "+"
elsif (text =~ /[A-ZА-Я]/)
print "!"
elsif (text =~ /[0-9\s\S]/)
print "2"
end
elsif (number == "6")
if (text =~ /[a-zа-я]/)
print "X"
elsif (text =~ /[A-ZА-Я]/)
print "&"
elsif (text =~ /[0-9\s\S]/)
print "P"
end
elsif (number == "7")
if (text =~ /[a-zа-я]/)
print "5"
elsif (text =~ /[A-ZА-Я]/)
print "3"
elsif (text =~ /[0-9\s\S]/)
print "z"
end
elsif (number == "8")
if (text =~ /[a-zа-я]/)
print "w"
elsif (text =~ /[A-ZА-Я]/)
print "q"
elsif (text =~ /[0-9\s\S]/)
print "7"
end
elsif (number == "9")
if (text =~ /[a-zа-я]/)
print "#"
elsif (text =~ /[A-ZА-Я]/)
print "T"
elsif (text =~ /[0-9\s\S]/)
print "8"
end
else
if (text =~ /[a-zа-я]/)
print "A"
elsif (text =~ /[A-ZА-Я]/)
print "b"
elsif (text =~ /[0-9\s\S]/)
print "0"
end
end
end


PS: Спасибо за внимание!
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх