Программа шифрования Python ASCII

1

Добрый день,

Я создал простую программу шифрования ASCII, и у меня есть только 3 вопроса:

  1. Как я могу проверить, введен ли введенный ключ неправильно и сообщить моей программе, чтобы она не пыталась расшифровать, если она была введена неправильно.
  2. Почему зашифрованный текст длиннее оригинала?
  3. Если бы я хотел зашифровать другие вещи, а не текст ASCII, насколько это было бы сложно?

Спасибо, вот мой код и результаты ниже:

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)
Теги:
encryption
cryptography
ascii

1 ответ

1
Лучший ответ

Прежде всего, добавление с символами ключа не является хорошим шифром, даже хорошим шифром Цезаря или Вигена. Для этого вам потребуется модульное дополнение: либо модуль 26 для нормального алфавита (но без up- или строчных и других символов) или модуль 256 для байтов. В случае байтов вам понадобится случайное значение для каждого байта ключа.

В настоящее время ваш зашифрованный текст имеет предвзятость: если вы добавите значение символа с 0x00 с ключом 0x00, вы получите 0x00 в качестве байта зашифрованного текста. Проблема в том, что значение 0x00 достигается только с помощью этой конкретной комбинации в вашей схеме шифрования. Поэтому, если вы видите значение 0x00, вы сразу же узнаете как значение ключа, так и значение открытого текста.

Как я могу проверить, введен ли введенный ключ неправильно и сообщить моей программе, чтобы она не пыталась расшифровать, если она была введена неправильно.

Невозможно проверить правильность значения ключа или нет. Единственное, что вы можете сделать, это проверить, является ли результат ожидаемым.

Современная криптография использует код аутентификации сообщения (MAC) для создания тега аутентификации. Этот тег может быть проверен на основе шифрованного текста и ключа (или для менее безопасной схемы, открытого текста и ключа). Существуют также аутентифицированные способы шифрования, такие как GCM, которые в основном шифры с встроенной аутентификацией MAC.

Почему зашифрованный текст длиннее оригинала?

Если вы добавите значения со значением 255 или ниже, вы получите значения 510 или ниже. Однако эти значения берут два байта для кодирования, по крайней мере.

Если бы я хотел зашифровать другие вещи, а не текст ASCII, насколько это было бы сложно?

Не так сложно: просто выполните XOR или модульное дополнение (например, по модулю 256 для 8 бит/один байт) с действительно случайным ключом. Тем не менее, чтобы создать что-либо безопасное, вы либо используете одноразовый блок (где ключ имеет тот же размер, что и двоичный открытый текст), либо современный шифр.

  • 0
    Спасибо за ваш быстрый ответ. Вы либо ответили на мой вопрос, либо взорвали мой разум, либо оба. Ну, по крайней мере, я опустил пальцы в ледяную воду шифрования. Это было весело, и в будущем я просто импортирую готовый класс шифров для своих программ. Когда я становлюсь более продвинутым, я пытаюсь сделать еще один более сложный шифр в будущем, потому что хорошо знать, как они работают. Еще раз спасибо.
  • 0
    Один из возможных способов проверить правильность ключа - добавить заполнение в конце сообщения перед шифрованием. К сожалению, стандартное заполнение PKCS # 7 использует байты не ASCII, но может быть адаптировано для ASCII только с небольшой работой. Проверьте заполнение после дешифрования, и если оно неверно, значит, вы знаете, что ключ или что-то не так.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню