Прежде всего, добавление с символами ключа не является хорошим шифром, даже не хорошим шифром Цезаря или Вигенера. Для этого вам понадобится модульное дополнение: модуль 26 для обычного алфавита (но без прописных или строчных букв и других символов) или модуль 256 для байтов. В случае байтов вам потребуется случайное значение для каждого байта ключа.
В настоящее время ваш зашифрованный текст имеет смещение: если вы добавите символьное значение с 0x00 с ключом 0x00, то вы получите 0x00 в качестве байта зашифрованного текста. Проблема в том, что значение 0x00 равно , которое когда-либо достигается только с этой конкретной комбинацией в вашей схеме шифрования. Поэтому, если вы увидите значение 0x00, вы сразу узнаете значение ключа и текста.
Как я могу проверить, правильно ли введен ключ, и попросить мою программу не пытаться расшифровать, если он был введен неправильно.
Невозможно проверить, является ли значение ключа правильным или нет. Единственное, что вы можете сделать, это проверить, соответствует ли результат ожидания.
Современная криптография использует код аутентификации сообщения (MAC) для создания тега аутентификации. Этот тег может быть проверен на соответствие зашифрованному тексту и ключу (или, для менее безопасной схемы, обычному тексту и ключу). Существуют также аутентифицированные режимы шифрования, такие как GCM, которые в основном представляют собой шифры со встроенной аутентификацией MAC.
Почему зашифрованный текст длиннее оригинала?
Если вы добавите значения со значением 255 или ниже, вы получите значения 510 или ниже. Эти значения, однако, занимают минимум два байта для кодирования.
Если бы я хотел зашифровать другие вещи, а не текст ASCII, насколько это было бы сложно?
Не так сложно: просто выполните XOR или модульное сложение (например, по модулю 256 для 8 бит / один байт) с действительно случайным ключом. Однако, чтобы создать что-нибудь безопасное, вы должны использовать одноразовую клавиатуру (где размер ключа равен двоичному тексту) или современный шифр.