123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- import sqlite3
- def create_tables():
- conn = sqlite3.connect('alphabets.db')
- cursor = conn.cursor()
- cursor.execute('''CREATE TABLE IF NOT EXISTS alphabets
- (id INTEGER PRIMARY KEY, name TEXT, alphabet TEXT)''')
- cursor.execute('''CREATE TABLE IF NOT EXISTS encrypted_texts
- (id INTEGER PRIMARY KEY, encrypted_text TEXT)''')
- cursor.execute('''INSERT INTO alphabets (name, alphabet) VALUES
- ('Полный русский алфавит', 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'),
- ('Без буквы ё', 'абвгдежзийклмнопрстуфхцчшщъыьэюя'),
- ('С подчеркиванием', 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя_')''')
- conn.commit()
- conn.close()
- def get_custom_alphabet():
- length = int(input("Введите длину алфавита: "))
- alphabet = input(f"Введите свой алфавит ({length} символов): ")
- if len(alphabet) != length:
- print("Длина алфавита не соответствует заданной!")
- return None
- return alphabet
- def get_preset_alphabet(choice):
- conn = sqlite3.connect('alphabets.db')
- cursor = conn.cursor()
- cursor.execute('SELECT alphabet FROM alphabets WHERE id=?', (choice,))
- alphabet = cursor.fetchone()[0]
- conn.close()
- return alphabet
- def save_encrypted_text(text):
- conn = sqlite3.connect('alphabets.db')
- cursor = conn.cursor()
- cursor.execute('INSERT INTO encrypted_texts (encrypted_text) VALUES (?)', (text,))
- conn.commit()
- conn.close()
- def get_last_encrypted_text():
- conn = sqlite3.connect('alphabets.db')
- cursor = conn.cursor()
- cursor.execute('SELECT encrypted_text FROM encrypted_texts ORDER BY id DESC LIMIT 1')
- encrypted_text = cursor.fetchone()[0]
- conn.close()
- return encrypted_text
- def vigenere_encrypt(plaintext, key, alphabet):
- encrypted = ''
- alphabet_len = len(alphabet)
- key_indices = [alphabet.index(char) for char in key]
- for i, char in enumerate(plaintext):
- if char in alphabet:
- plain_idx = alphabet.index(char)
- key_idx = key_indices[i % len(key)]
- encrypted += alphabet[(plain_idx + key_idx) % alphabet_len]
- else:
- encrypted += char
- return encrypted
- def vigenere_decrypt(ciphertext, key, alphabet):
- decrypted = ''
- alphabet_len = len(alphabet)
- key_indices = [alphabet.index(char) for char in key]
- for i, char in enumerate(ciphertext):
- if char in alphabet:
- cipher_idx = alphabet.index(char)
- key_idx = key_indices[i % len(key)]
- decrypted += alphabet[(cipher_idx - key_idx) % alphabet_len]
- else:
- decrypted += char
- return decrypted
- def main():
- create_tables()
-
- choice = int(input("Введите 1 для своего алфавита, 2 для заготовленного: "))
- if choice == 1:
- alphabet = get_custom_alphabet()
- else:
- preset_choice = int(input("Выберите заготовленный алфавит (1 полный Рсский алфавит без ё, 2 с ё, или 3 с _ в конце ): "))
- alphabet = get_preset_alphabet(preset_choice)
-
- if not alphabet:
- print("Ошибка с алфавитом!")
- return
-
- print(f"Ваш алфавит: {alphabet}")
-
- while True:
- action = input("Введите 'шифр' для шифрования, 'дешифр' для расшифрования, 'exit' для выхода: ")
- if action == 'шифр':
- key = input("Введите ключ: ")
- plaintext = input("Введите текст для шифрования: ")
- encrypted_text = vigenere_encrypt(plaintext, key, alphabet)
- print(f"Зашифрованный текст: {encrypted_text}")
- save_encrypted_text(encrypted_text)
- elif action == 'дешифр':
- key = input("Введите ключ: ")
- ciphertext = get_last_encrypted_text()
- decrypted_text = vigenere_decrypt(ciphertext, key, alphabet)
- print(f"Расшифрованный текст: {decrypted_text}")
- elif action == 'exit':
- print("Программа завершена.")
- break
- else:
- print("Неверная команда, попробуйте снова.")
- if __name__ == '__main__':
- main()
|