Курси програмування для дітей безкоштовно

12. Шифрування та шифр Цезаря на Ruby

Шифрування та шифр Цезаря на Ruby | Ruby для дітей | ITisFuture

На цьому уроці «Шифрування та шифр Цезаря на Ruby» ми дізнаємося, як працюють секретні повідомлення, і створимо програму, яка зможе їх зашифровувати та розшифровувати. 🔐💻

Про шифрування у кількох словах

Чи часто треба передавати секретні повідомлення у мережі ? Так, навіть коли ми обмінюємося повідомленнями з друзями через месенджер, таке повідомлення шифрується, щоб інші люди не могли його перехопити, прочитати чи змінити. Так розробники месенджера дбають про безпеку своїх користувачів. Вони не можуть захистити від всіх хакерських атак, але дбають про секретність обміну повідомленнями. Що вже казати про передачу пароля на сервер сайту, в який ми намагаємося потрапити. Для цього в комп’ютерах використовують шифрування — спеціальні математичні “коди”, які перетворюють звичайний текст у незрозумілий набір символів. Це основа безпеки в інтернеті: від месенджерів до банківських операцій.

З точки зору математики, жоден шифр не є на 100% безпечним, бо всі можна розшифрувати за якусь кількість спроб. Але сучасні алгоритми шифрування потребують настільки величезної кількості спроб для розшифровки й підбору алгоритму, що вважаються досить надійними.

Є два основні типи шифрування: симетричне (його ще інколи називають “синхронним”) і асиметричне (“асинхронне”).
У симетричному шифруванні є один спільний ключ — це однаковий пароль, який знають обидва користувачі. Ви шифруєте повідомлення цим ключем, і на іншому кінці тим самим ключем його розшифровують. Це швидко і зручно, але проблема — як безпечно передати сам ключ?
Асиметричне шифрування працює хитріше: тут є два ключі — відкритий (його можна всім показувати) і приватний (його тримаєте у секреті). Якщо хтось шифрує повідомлення вашим відкритим ключем, розшифрувати його зможете тільки ви своїм приватним ключем. Саме так працюють багато сучасних систем, наприклад, HTTPS — вони дозволяють безпечно обмінюватися даними навіть через відкритий інтернет.

Шифрування та шифр Цезаря на Ruby | Ruby для дітей | ITisFuture

Шифр Цезаря

Шифр Цезаря використовували в армії Юлія Цезаря, щоб обмінюватися повідомленнями, і противник не міг їх розгадати. Для цього брали алфавіт і зсували на кілька символів. Наприклад, домовлялися, що зсів буде на 3 символи. Тобто замість літери “а” писали “с”, замість “е” була “g”.
Зараз цей шифр дуже легко зламується, тому не використовується в сучасних алгоритмах. Але ця технологія дала початок криптографії — науці про шифри й секретні повідомлення. Тому багато починаючих програмістів створюють програму для шифру Цезаря, щоб пізніше перейти до складніших алгоритмів. Спробуємо і ми.

Шифрування та шифр Цезаря на Ruby | Ruby для дітей | ITisFuture
Шифрування та шифр Цезаря на Ruby | Ruby для дітей | ITisFuture
Шифрування та шифр Цезаря на Ruby | Ruby для дітей | ITisFuture
Шифрування та шифр Цезаря на Ruby | Ruby для дітей | ITisFuture

Практика. Шифрування та шифр Цезаря на Ruby

1: Створімо змінну alphabet з абеткою (українською або англійською на вибір). Також у змінній text будемо зберігати секретне повідомлення. В змінній res будемо зберігати зашифроване повідомлення. Текст переводимо в нижній регістр, щоб спростити собі життя. Зверніть увагу, що абетка починається з пробілу. Як думаєте, чому це ?

alphabet = " abcdefghijklmnopqrstuvwxyz"
alphabet = " абвгґдеєжзиіїйклмнопрстуфхцчшщьюя"

text="Секрет: кожна домашка розмножується, якщо її відкладати."
text=text.downcase
res=''

2: Додамо перший цикл по всіх літерах секретного повідомлення. Спочатку просто виведемо їх на екран.

for letter in text.each_char
    puts letter
end

3: Настав час навісити ще один цикл, який бігатиме по алфавіту і перевірятиме, на якому місці в алфавіті стоїть перша літера в повідомленні, на якому друга… Коли знайдемо цей номер, нам лишиться лише додати до нього зсув (на 3 літери в прикладі)

for letter in text.each_char
  #puts letter
  for i in 0..alphabet.length
    if letter==alphabet[i]
    puts "OLD: #{alphabet[i]} #{i} New: #{alphabet[i+3]} #{i+3} "
    newNumb=i+3
    res=res+alphabet[newNumb].to_s
    end
  end
end
puts "Encrypted message: #{res}"

4: Програма працює, але, мабуть, не для всіх літер. Додайте в повідомлення щось з літерою “Я”, наприклад. “Я” і так остання літера в абетці, то куди ж зсуватися? Відповідь проста — брати літери спереду абетки. Для цього додамо нову перевірку (новий код вже виділено):

for letter in text.each_char
  #puts letter
  for i in 0..alphabet.length
    if letter==alphabet[i]
    if i+3>alphabet.length
      newNumb=i+3-alphabet.length    
    else     
      newNumb=i+3
    end
    puts "OLD: #{alphabet[i]} #{i} New: #{alphabet[newNumb]} #{newNumb}"
    res=res+alphabet[newNumb].to_s
    end
  end
end
Меми і жарти про ІТ та програмістів | Ruby для дітей | ITisFuture


Це фінальний код. Спробуйте з різними повідомленнями.

Власний дизайн шифру

5: Цей шифр ви зможете задизайнити самостійно. Є два алфавіти — перший звичайний, український, а в другому деякі літери змініть на цифри чи смайли. Щоб зашифрувати, треба буде вивести замість літери з першого алфавіту, літеру з другого.

ua_alphabet = " абвгґдеєжзиіїйклмнопрстуфхцчшщьюя"
ec_alphabet = " @🍌вгґде🦄ж3и1їйкл🦋ноп🐌стуфхц4шщьюя"
Уроки програмування для дітей. Домашня робота

Домашня робота

1: Трохи переробіть шифр Цезаря з класної роботи :
Замість того, щоб постійно прописувати зсув (число 3), використайте змінну. В цю змінну запишіть інше число, на яке має посунутися шифр. Перевірте, що шифровка працює, в тому числі для літер “а” та “я” (або “a” i “z”)

2: Додайте в алфавіт ще й великі літери та пунктуаційні знаки (наприклад, крапку, кому). Змініть програму так, щоб вона шифрувала і великі літери, і знаки. (тепер переводити в маленькі літери не треба)
Щоб полегшити вам життя :
ABCDEFGHIJKLMNOPQRSTUVWXYZ
АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ

3: Напишіть дешифратор для шифру Цезаря. Щоб протестувати, розшифруйте повідомлення з першого завдання.

Меми і жарти про ІТ та програмістів | Ruby для дітей | ITisFuture
Уроки програмування для дітей ускладнені завдання level up

Level Up!
Шифрування та шифр Цезаря на Ruby

1: Шифр Атбаш (Atbash cipher) — це шифр-дзеркало. Алгоритм дуже простий: алфавіт перевертається (А↔Я, Б↔Ю…). Логіка схожа на Цезаря, але без зсуву. Створіть програму, яка зашифровує і розшифровує повідомлення цим шифром. Підказка: абетка.reverse

2: RSA algorithm — це спосіб шифрування, який використовує два ключі: один відкритий (ним шифрують), а інший секретний (ним розшифровують). Він потрібен, щоб безпечно передавати повідомлення в інтернеті, навіть якщо хтось їх перехопить.
Саме такий принцип використовується в сучасних сайтах, месенджерах і онлайн-банках.

Розташуйте в правильному порядку рядки програми, яка зашифровує і розшифровує повідомлення методом RSA за допомогою вбудованої бібліотеки ruby. Коментарі також розставте біля відповідних рядків

puts "Зашифровано (bytes): #{encrypted.bytes}"

rsa = OpenSSL::PKey::RSA.new(2048)

# Розшифрування (приватним ключем)

public_key = rsa.public_key

message = "Hello from Ruby RSA!"

encrypted = public_key.public_encrypt(message)

require 'openssl'

puts "Розшифровано: #{decrypted}"

private_key = rsa

# Генерація ключів (2048 біт)

puts "Повідомлення: #{message}"

# Шифрування (публічним ключем)

decrypted = private_key.private_decrypt(encrypted)
Меми і жарти про ІТ та програмістів | Ruby для дітей | ITisFuture
Шифрування та шифр Цезаря на Ruby | Ruby для дітей | ITisFuture

Не зупиняйтеся у вивченні Ruby! До зустрічі на наступних уроках!

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *