• 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
270 wizyt
pytanie zadane 7 września 2023 w Nasze projekty przez Mirosław Zelent Nałogowiec (34,780 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,090 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,780 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,780 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 235 wizyt
pytanie zadane 10 maja 2015 w Nasze projekty przez aspoka Mądrala (5,290 p.)
0 głosów
1 odpowiedź 419 wizyt
pytanie zadane 12 stycznia 2023 w C# przez DominikPie Użytkownik (770 p.)
+1 głos
1 odpowiedź 576 wizyt

92,674 zapytań

141,577 odpowiedzi

320,046 komentarzy

62,038 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

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!

...