
Все мы пытаемся так или иначе защитить свои данные и информацию о себе. В данной статье я расскажу, как сделать простейший генератор паролей на языке Ruby.
Итак, начнем.
Первый шаг
Сначала мы разберемся, как наш генератор должен работать. Я выбрал слегка необычный метод. Пользователь пишет фразу или слово, которое легко запоминается ему (например девичья фамилия матери) и пишет ключ из 5 цифр, по которому и будет идти изменение первой фразы.
Второй шаг
Теперь напишем алгоритм работы генератора:
- Ввод фразы
- Ввод ключа
- Работа программы:
- Сопоставление размеров пароля и ключа
- Перекодировка
- Вывод
Шаг третий
Для начала, подгрузим файл с функциями (он нам пригодится позже) и попросим ввести пароль и ключ:
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: Спасибо за внимание!