Добрый день,
Я создал простую программу шифрования ASCII, и у меня есть только 3 вопроса:
Спасибо, вот мой код и результаты ниже:
import time
key = "This■isôthe╝key¦b££glkHPAfgbm(*&%$$*(■ô▀"
string = "Encryption the hell out of me, even if I repeatttttttt lettersssss you can't tell"
entext = ""
detext = ""
keycnt=0
print("Displaing Text to be Encrypted")
time.sleep(1)
print(string)
time.sleep(5)
#Loops through the string and the key and adds the ascii values together to create a Encrypted character
for sLetter in string:
entext += chr(ord(sLetter) + ord(key[keycnt]))
keycnt += 1
if keycnt == len(key):
keycnt =0
print("Displaying encrypted Text")
time.sleep(1)
print(entext)
#Resetting key position
keycnt=0
#Loops through the string and the key and subtracts the ascii values together to create a decrypted character
for sLetter in entext:
detext += chr(ord(sLetter) - ord(key[keycnt]))
keycnt += 1
if keycnt == len(key):
keycnt =0
time.sleep(2)
print("Displaying decrypted Text")
time.sleep(1)
print(detext)
time.sleep(1)
Прежде всего, добавление с символами ключа не является хорошим шифром, даже хорошим шифром Цезаря или Вигена. Для этого вам потребуется модульное дополнение: либо модуль 26 для нормального алфавита (но без up- или строчных и других символов) или модуль 256 для байтов. В случае байтов вам понадобится случайное значение для каждого байта ключа.
В настоящее время ваш зашифрованный текст имеет предвзятость: если вы добавите значение символа с 0x00 с ключом 0x00, вы получите 0x00 в качестве байта зашифрованного текста. Проблема в том, что значение 0x00 достигается только с помощью этой конкретной комбинации в вашей схеме шифрования. Поэтому, если вы видите значение 0x00, вы сразу же узнаете как значение ключа, так и значение открытого текста.
Как я могу проверить, введен ли введенный ключ неправильно и сообщить моей программе, чтобы она не пыталась расшифровать, если она была введена неправильно.
Невозможно проверить правильность значения ключа или нет. Единственное, что вы можете сделать, это проверить, является ли результат ожидаемым.
Современная криптография использует код аутентификации сообщения (MAC) для создания тега аутентификации. Этот тег может быть проверен на основе шифрованного текста и ключа (или для менее безопасной схемы, открытого текста и ключа). Существуют также аутентифицированные способы шифрования, такие как GCM, которые в основном шифры с встроенной аутентификацией MAC.
Почему зашифрованный текст длиннее оригинала?
Если вы добавите значения со значением 255 или ниже, вы получите значения 510 или ниже. Однако эти значения берут два байта для кодирования, по крайней мере.
Если бы я хотел зашифровать другие вещи, а не текст ASCII, насколько это было бы сложно?
Не так сложно: просто выполните XOR или модульное дополнение (например, по модулю 256 для 8 бит/один байт) с действительно случайным ключом. Тем не менее, чтобы создать что-либо безопасное, вы либо используете одноразовый блок (где ключ имеет тот же размер, что и двоичный открытый текст), либо современный шифр.