Я не гуру шифров, но на ум приходит очевидный вопрос: можно ли вам использовать шифрование с помощью одноразового блокнота? Затем вы можете просто включить большой блок действительно случайных битов в свою систему декодирования и использовать случайные данные для обратимого преобразования ваших десятичных цифр.
Если это будет приемлемо, нам просто нужно выяснить, как декодер узнает, где в блоке случайности искать ключ для декодирования любого конкретного сообщения. Если вы можете отправить временную метку в виде открытого текста с зашифрованным текстом, то это легко: преобразуйте временную метку в число, скажем, количество секунд, прошедших с даты эпохи, по модулю этого числа на длину блока случайности, и вы получите смещение в пределах блокировать.
При достаточно большом блоке случайности это должно быть невозможно взломать. Вы можете сами зашифровать случайные биты с помощью надежного шифрования, чтобы пользователь должен был ввести длинный пароль, чтобы разблокировать декодер; таким образом, даже если программное обеспечение для расшифровки будет захвачено, взломать систему все равно будет непросто.
Если вы заинтересованы в этом и хотели бы, чтобы я расширился, дайте мне знать. Я не хочу тратить много времени на ответ, который совсем не соответствует вашим потребностям.
РЕДАКТИРОВАТЬ: Хорошо, с крошечным кусочком ободрения («вы можете что-то понять») я расширяю свой ответ.
Идея в том, что вы получаете блок случайности. Один из простых способов сделать это — просто извлечь данные с устройства Linux /dev/random
. . Теперь я собираюсь предположить, что у нас есть какой-то способ найти индекс в этом блоке случайности для каждого сообщения.
Индексируйте блок случайности и извлеките десять байтов данных. Каждый байт представляет собой число от 0 до 255. Добавьте каждое из этих чисел к соответствующей цифре открытого текста по модулю 10, и вы получите цифры зашифрованного текста. Вы можете легко изменить это, если у вас есть блок случайных данных и индекс: вы получаете случайные биты и вычитаете их из цифр шифра по модулю 10.
Вы можете думать об этом как о расположении цифр от 0 до 9 в кольцо. Сложение ведется по кругу по часовой стрелке, а вычитание — против часовой стрелки. Вы можете добавить или вычесть любое число, и оно будет работать. (В моей первоначальной версии этого ответа предлагалось использовать только 3 бита на цифру. Недостаточно, как указано ниже @Baffe Boyois. Спасибо за это исправление.)
Если цифра обычного текста равна 6, а случайное число равно 117, то: 6 + 117 == 123, по модулю 10 == 3. 3 - 117 == -114, по модулю 10 == 6.
Как я уже сказал, проблема поиска индекса проста, если вы можете использовать внешнюю информацию открытого текста, такую как метка времени. Даже если ваш оппонент знает, что вы используете метку времени для расшифровки сообщений, без блока случайности это не поможет.
Проблема поиска индекса также проста, если сообщение доставляется всегда; вы можете иметь согласованную систему создания ряда индексов и сказать: «Это четвертое сообщение, которое я получил, поэтому я использую четвертый индекс в серии». В качестве тривиального примера, если это четвертое полученное сообщение, вы можете согласиться использовать значение индекса 16 (4 для четвертого сообщения, умноженное на 4 байта на одноразовый блокнот). Но вы также можете использовать числа из утвержденного генератора псевдослучайных чисел, инициализированные согласованным постоянным значением в качестве начального числа, и тогда вы получите несколько непредсказуемую серию индексов в блоке случайности.
В зависимости от ваших потребностей у вас может быть действительно большой кусок случайных данных (сотни мегабайт или даже больше). Если вы используете 10 байтов в качестве одноразового блокнота и никогда не используете перекрывающиеся или повторно используемые блокноты, то 1 мегабайт случайных данных даст более 100 000 одноразовых блокнотов.
person
steveha
schedule
08.12.2009