• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Szyfrowanie Vigenère’a - projekty

Object Storage Arubacloud
+1 głos
236 wizyt
pytanie zadane 7 września 2023 w Nasze projekty przez Mirosław Zelent Nałogowiec (34,750 p.)
przywrócone 14 września 2023 przez Mirosław Zelent

To jest wątek ogłoszony w tym odcinku CTF(9):

https://youtu.be/jeIF5EzaBCY

Tutaj można wkleić własne pomysły na pracę z szyfrowaniem Vigenère’a lub spróbować zrelizować coś z zadań dodatkowych:

  1. Stwórz program, który zawiera funkcje: szyfrującą i deszyfrującą - parametrami funkcji będą: wiadomość oraz klucz. Funkcja powinna być “niewrażliwa” na problem znaków białych lub przestankowych (spacje, przecinki, kropki, wykrzykniki itd.)

  2. Stwórz witrynę internetową (HTML + CSS + JS), która zawiera narysowaną tabulę rectę i po podaniu potrzebnych danych (wiadomość, klucz, szyfrujemy czy deszyfrujemy?) oraz naciśnięciu przycisku pokazuje kolejne kroki szyfrowania w animacji (podświetlając kolejne kolumny i wiersze i listując wykonane kroki) - przykład takiej witryny: https://jerzy.jasonek.pl/algorytmy/vigenere_cipher.html

  3. Wykonaj program, w którym tabula recta nie jest zbudowana na alfabecie angielskim (26 liter), lecz polskim (32 litery) - dodatkowo, zamiast działać na wyrazach wprowadzanych z klawiatury, powinien odczytywać tekst z pliku tekstowego oraz zapisywać wyniki swojej pracy również do pliku.

  4. Napisz algorytm, który dokona próby brute force’owego deszyfrowania wiadomości (kiedy klucz nie jest nam znany)

1
komentarz 14 września 2023 przez reaktywny Nałogowiec (41,050 p.)
Ciekawy temat!

3 odpowiedzi

+2 głosów
odpowiedź 11 kwietnia przez gal_kris Początkujący (320 p.)
edycja 11 kwietnia przez Mirosław Zelent
def vigenere_cipher(text, key, decrypt=False):
    polish_alphabet = "aąbcćdeęfghijklłmnńoópqrsśtuvwxyzźż"
    key_len = len(key)
    result = ""

    for i, char in enumerate(text.lower()):
        if char in polish_alphabet:
            key_char = key[i % key_len]
            key_index = polish_alphabet.find(key_char)
            if decrypt:
                shift = polish_alphabet.find(char) - key_index
            else:
                shift = polish_alphabet.find(char) + key_index
            result += polish_alphabet[shift % len(polish_alphabet)]
        else:
            result += char

    return result

def main():
    text = input("Podaj tekst do zaszyfrowania/dekodowania: ")
    key = input("Podaj klucz: ")
    mode = input("Wybierz tryb (szyfrowanie/odszyfrowanie) [s/o]: ").lower()

    if mode == 's':
        encrypted_text = vigenere_cipher(text, key)
        print("Zakodowany tekst:", encrypted_text)
    elif mode == 'o':
        decrypted_text = vigenere_cipher(text, key, decrypt=True)
        print("Odszyfrowany tekst:", decrypted_text)
    else:
        print("Niepoprawny tryb. Wpisz 's' dla szyfrowania lub 'o' dla odszyfrowania.")

if __name__ == "__main__":
    main()

 

komentarz 11 kwietnia przez Mirosław Zelent Nałogowiec (34,750 p.)
Dzięki za podzielenie się swoim kodem i za rozkminę nad tym szyfrowaniem! Na przyszłość fajnie zawsze dorzucić kod w bloczku (dla użyteczności / estetyki) - tutaj w tym poście zrobię to za Ciebie. Pozdrawiam serdecznie!
+2 głosów
odpowiedź 11 kwietnia przez gal_kris Początkujący (320 p.)
edycja 11 kwietnia przez Mirosław Zelent

i kolejny kod
 

import tkinter as tk
from tkinter import filedialog

def load_file():
    filename = filedialog.askopenfilename()
    with open(filename, 'r', encoding='utf-8') as file:
        text_entry.delete(1.0, tk.END)
        text_entry.insert(tk.END, file.read())

def save_file(text_to_save):
    filename = filedialog.asksaveasfilename(defaultextension=".txt")
    with open(filename, 'w', encoding='utf-8') as file:
        file.write(text_to_save)

def process_text():
    text = text_entry.get(1.0, tk.END).strip()
    key = key_entry.get().strip().lower()
    mode = mode_var.get()

    if not text:
        result_label.config(text="Wprowadź tekst do przetworzenia!")
        return

    if not key:
        result_label.config(text="Wprowadź klucz!")
        return

    alphabet = "aąbcćdeęfghijklłmnńopqrsśtuóvwxyzźż"
    result = ""
    not_used = 0
    key_len = len(key)

    for i, char in enumerate(text.lower()):
        if char in alphabet:
            col = alphabet.find(key[(i - not_used) % key_len])
            distance = 0
            if mode == 's':
                distance = alphabet.find(char) + col
            elif mode == 'o':
                distance = alphabet.find(char) - col
            result += alphabet[distance % len(alphabet)]
        else:
            result += char
            not_used += 1

    result_label.config(text=result)
    save_file(result)

# Tworzenie głównego okna
root = tk.Tk()
root.title("Szyfr Vigenère'a")

# Ramka dla przycisku i pola tekstowego
frame = tk.Frame(root)
frame.pack(padx=10, pady=10)

# Pole tekstowe do wyświetlania tekstu z pliku
text_entry = tk.Text(frame, height=10, width=50)
text_entry.grid(row=0, column=0, padx=5, pady=5)

# Przycisk do wybierania pliku
file_button = tk.Button(frame, text="Wybierz plik", command=load_file)
file_button.grid(row=0, column=1, padx=5, pady=5)

# Etykieta i pole do wprowadzenia klucza
key_label = tk.Label(frame, text="Klucz:")
key_label.grid(row=1, column=0, padx=5, pady=5, sticky="w")
key_entry = tk.Entry(frame)
key_entry.grid(row=1, column=1, padx=5, pady=5, sticky="ew")

# Przyciski do wyboru trybu działania
mode_label = tk.Label(frame, text="Tryb:")
mode_label.grid(row=2, column=0, padx=5, pady=5, sticky="w")
mode_var = tk.StringVar()
mode_var.set("s")  # Domyślnie szyfrowanie
encrypt_radio = tk.Radiobutton(frame, text="Szyfrowanie", variable=mode_var, value="s")
encrypt_radio.grid(row=2, column=1, padx=5, pady=5, sticky="w")
decrypt_radio = tk.Radiobutton(frame, text="Odszyfrowanie", variable=mode_var, value="o")
decrypt_radio.grid(row=3, column=1, padx=5, pady=5, sticky="w")

# Przycisk do przetwarzania tekstu
process_button = tk.Button(frame, text="Przetwórz", command=process_text)
process_button.grid(row=4, column=0, columnspan=2, padx=5, pady=5)

# Etykieta do wyświetlania wyniku
result_label = tk.Label(root, text="", wraplength=400)
result_label.pack(padx=10, pady=10)

root.mainloop()

 

+1 głos
odpowiedź 15 kwietnia przez gal_kris Początkujący (320 p.)

nad tym kodem siedzę od 5 rano jako że nie znam do końca css i js sporo musiałem wchłonąć i mam już głowę napuchniętą do granic możliwości, nie podglądałem podanej strony przez autora starałem się napisać kod sam, na tę chwilę kod wygląda tak:

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Szyfr Vigenère'a</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            height: 100vh;
            background-color: #f5f5f5;
        }

        .container {
            background-color: #fff;
            border-radius: 8px;
            box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
            padding: 20px;
            max-width: 600px;
            width: 100%;
        }

        label {
            font-weight: bold;
            margin-bottom: 5px;
            display: block;
        }

        input[type="text"], select {
            width: 100%;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 4px;
            margin-bottom: 15px;
            box-sizing: border-box;
        }

        button {
            background-color: #007bff;
            color: #fff;
            border: none;
            border-radius: 4px;
            padding: 10px 20px;
            cursor: pointer;
            font-size: 16px;
        }

        button:hover {
            background-color: #0056b3;
        }

        table {
            border-collapse: collapse;
            margin-top: 20px;
            width: 100%;
        }

        th, td {
            border: 1px solid #ccc;
            padding: 10px;
            text-align: center;
        }

        #steps {
            margin-top: 20px;
            list-style-type: none;
            padding: 0;
        }

        #steps li {
            margin-bottom: 5px;
        }

        .coordinates {
            color: red;
            font-weight: bold;
        }

        .highlight {
            background-color: lightblue;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>Szyfr Vigenère'a</h2>
        <label for="message">Wiadomość:</label>
        <input type="text" id="message" value="testowatestdozakodowania">
        <label for="key">Klucz:</label>
        <input type="text" id="key" value="klucz">
        <label for="action">Wybierz akcję:</label>
        <select id="action">
            <option value="encrypt">Szyfrowanie</option>
            <option value="decrypt">Deszyfrowanie</option>
        </select>
        <button onclick="startAnimation()">Start</button>
        <table id="vigenereTable"></table>
        <ul id="steps"></ul>
        <div id="result"></div>
    </div>

    <script>
        function startAnimation() {
            var message = document.getElementById("message").value.toLowerCase().replace(/[^a-ząćęłńóśźż]/g, '');
            var key = document.getElementById("key").value.toLowerCase().replace(/[^a-ząćęłńóśźż]/g, '');
            var action = document.getElementById("action").value;

            if (message.length === 0 || key.length === 0) {
                alert("Proszę podać wiadomość i klucz.");
                return;
            }

            var table = document.getElementById("vigenereTable");
            var alphabet = "aąbcćdeęfghijklłmnńoprstuwxyzźż";

            var animationDelay = 1000;
            var stepCounter = 1;
            var stepsList = document.getElementById("steps");
            stepsList.innerHTML = "";
            var resultDiv = document.getElementById("result");
            resultDiv.textContent = "";

            // Clear table
            table.innerHTML = "";

            // Insert header row
            var headerRow = table.insertRow();
            headerRow.appendChild(document.createElement("th")); // Empty cell
            for (var i = 0; i < alphabet.length; i++) {
                var cell = headerRow.appendChild(document.createElement("th"));
                cell.textContent = alphabet[i];
            }

            // Insert table rows
            for (var i = 0; i < alphabet.length; i++) {
                var row = table.insertRow();
                var letterCell = row.insertCell();
                letterCell.textContent = alphabet[i];
                for (var j = 0; j < alphabet.length; j++) {
                    var cell = row.insertCell();
                    cell.textContent = alphabet[(i + j) % alphabet.length];
                }
            }

            for (let i = 0; i < message.length; i++) {
                setTimeout(function(i) {
                    return function() {
                        var rowIndex = alphabet.indexOf(message[stepCounter - 1]);
                        var colIndex = alphabet.indexOf(key[(stepCounter - 1) % key.length]);
                        if (rowIndex < 0 || colIndex < 0) return; // Skip invalid characters

                        var row = table.rows[rowIndex + 1];
                        var prevRowIndex = alphabet.indexOf(message[stepCounter - 2]);
                        var prevColIndex = alphabet.indexOf(key[(stepCounter - 2) % key.length]);
                        if (prevRowIndex >= 0 && prevColIndex >= 0) {
                            var prevRow = table.rows[prevRowIndex + 1];
                            prevRow.classList.remove("highlight");
                            prevRow.cells[prevColIndex + 1].classList.remove("coordinates");
                            table.rows[0].cells[prevColIndex + 1].classList.remove("highlight");
                        }

                        if (action === "encrypt") {
                            row.classList.add("highlight");
                            row.cells[colIndex + 1].classList.add("coordinates");
                            table.rows[0].cells[colIndex + 1].classList.add("highlight");
                        } else {
                            row.classList.add("highlight");
                            row.cells[colIndex + 1].classList.add("coordinates");
                            table.rows[0].cells[colIndex + 1].classList.add("highlight");
                        }

                        var stepDescription = document.createElement("li");
                        stepDescription.textContent = "Krok " + stepCounter + ": " + (action === "encrypt" ? "Szyfrowanie" : "Deszyfrowanie") + " " + message[stepCounter - 1] + " z kluczem " + key[(stepCounter - 1) % key.length] + " = " + table.rows[rowIndex + 1].cells[colIndex + 1].textContent;
                        stepsList.appendChild(stepDescription);

                        if (stepCounter === message.length) {
                            resultDiv.textContent = "Wynik " + (action === "encrypt" ? "szyfrowania" : "deszyfrowania") + ": " + getResult();
                        }
                        stepCounter++;
                    }
                }(i), i * animationDelay);
            }
        }

        function getResult() {
            var message = document.getElementById("message").value.toLowerCase().replace(/[^a-ząćęłńóśźż]/g, '');
            var key = document.getElementById("key").value.toLowerCase().replace(/[^a-ząćęłńóśźż]/g, '');
            var action = document.getElementById("action").value;
            var result = "";
            var alphabet = "aąbcćdeęfghijklłmnńoprstuwxyzźż";

            for (var i = 0; i < message.length; i++) {
                var rowIndex = alphabet.indexOf(message[i]);
                var colIndex = alphabet.indexOf(key[i % key.length]);
                if (rowIndex < 0 || colIndex < 0) return; // Skip invalid characters
                result += document.getElementById("vigenereTable").rows[rowIndex + 1].cells[colIndex + 1].textContent;
            }

            return result;
        }
    </script>
</body>
</html>

 

komentarz 15 kwietnia przez Mirosław Zelent Nałogowiec (34,750 p.)
Fajnie, że mamy wersję JS - dzięki za rozkminę z szyfrowaniem - mam nadzieję, że bawiłeś się dobrze przy tym CTF :) Pozdrawiam!

Podobne pytania

0 głosów
2 odpowiedzi 225 wizyt
pytanie zadane 10 maja 2015 w Nasze projekty przez aspoka Mądrala (5,290 p.)
0 głosów
1 odpowiedź 394 wizyt
pytanie zadane 12 stycznia 2023 w C# przez DominikPie Użytkownik (770 p.)
+1 głos
1 odpowiedź 543 wizyt

92,584 zapytań

141,433 odpowiedzi

319,668 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...