Идемпотентная процедура/алгоритм дешифрования

Существует ли простой алгоритм дешифрования, который является идемпотентным? Что-то вроде этого:

decrypt(encrypt(x)) ===  x  === decrypt(decrypt(decrypt(encrypt(x))))

Я не думаю, что у вас может быть что-то биективное и идемпотентное, кроме тождества.

Nico Schertler 15.05.2019 03:54

Не могли бы вы просто определить, было ли что-то расшифровано, а затем вернуть идентификатор, если это уже было?

Maarten Bodewes 15.05.2019 03:55

Но тогда decrypt(encrypt(x)) не может быть произвольным x

Ray Toal 15.05.2019 03:56

@MaartenBodewes не мог ли алгоритм расшифровки сделать это, поэтому мне не нужно?

user7898461 15.05.2019 03:58

@RayToal Э-э, да, но скажите, что x — это произвольное значение n бит, и что c = encrypt(x) также является произвольным значением n бит. Тогда выше не будет работать, верно? Обратите внимание, что у потоковых шифров есть свойство encrypt === decrypt, поэтому любое четное количество шифрований и расшифровок вернет открытый текст.

Maarten Bodewes 15.05.2019 04:10

№ (это место намеренно оставлено пустым)

n. 1.8e9-where's-my-share m. 15.05.2019 05:06

@OlegzandrDenman Боюсь, вы, возможно, ограничили свои ответы чисто теоретическими, так строго определив свою проблему - это практическая проблема, которую вы пытаетесь решить?

Luke Joshua Park 15.05.2019 05:35

Я согласен с @LukeJoshuaPark. Для всех практических применений эта проблема тривиальна. Добавьте заголовок к зашифрованным данным. Как только вы сделаете его бесполезным форматом (т. е. удалите заголовок), вы сделаете его невозможным, но также сделаете его плохим криптографическим форматом для большинства применений.

Rob Napier 15.05.2019 05:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
317
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Предположим, что decrypt — это функция f, а encrypt — это функция g. Следовательно, у нас есть f(g(x)) = x и f(f(f(g(x)))) = x. Следовательно, у нас есть f(f(x)) = x, а затем f(f(x)) = f(g(x)) = x. Если результатом функции расшифровки будет биективная функция, мы можем сделать вывод, что f(x) = g(x), а затем g(g(x)) = x. Кроме того, если мы предполагаем, что g(x) биективно, это означает, что f является обратным g. Поэтому g(x) = x!

Кроме того, если у нас нет биективного предположения для функции g (что не так уж далеко!), из g(g(x)) = x мы находим, что для всех входных x функция отображает значение g(x) в себя. Следовательно, g(x) = x по определению.

Тогда, наверное, нет :)

Maarten Bodewes 15.05.2019 04:14

Отличное резюме!

Luke Joshua Park 15.05.2019 04:31

Я не знаю об этом - простой алгоритм дешифрования может «прикрепить» «а» впереди, тогда, если алгоритм дешифрования, такой как «а» в начале, просто вернет ввод. Просто нужно добавить немного информации.

user7898461 15.05.2019 04:52

Если алгоритм дешифрования прикрепляет «а» впереди, то расшифровать (зашифровать (x)) не может быть x, потому что вы прикрепили «а» впереди. ОП сказал, что они хотят, чтобы расшифровка (шифрование (x)) была равна x. Вы не сможете этого сделать, если прикрепите лишние вещи. Если OP ослабит ограничение, то, возможно, вы сможете добавить дополнительную информацию о том, что значение уже было расшифровано, но это должно быть за пределами исходного сообщения, а не его частью.

Ray Toal 15.05.2019 05:10

правда - с этим согласен

user7898461 15.05.2019 10:08

Вот еще один вариант (но примите ответ OmG).

  1. Функция расшифровки должна быть инъективной, иначе она бесполезна.

  2. Вы хотите, чтобы функция расшифровки была идемпотентной.

  3. только идемпотентная инъективная функция является тождественной функцией. Доказательство. Пусть f идемпотентна и инъективна. Тогда по определению идемпотента f (f (x)) = f (x). Теперь, поскольку f инъективно, f(x) отображается в f(x) для всех x, так что эй, это функция тождества. КЭД

  4. Функция тождества является утвердительным ответом на ваш вопрос «Существует ли простой алгоритм дешифрования, который является идемпотентным?»

  5. ОДНАКО функция идентификации не является реальной функцией дешифрования, потому что она подразумевает, что зашифрованный текст и сообщение должны быть одинаковыми, так что на практике это совершенно бесполезно, и в этом случае лучший ответ на ваш вопрос — «нет».

Если дешифрование должно быть идемпотентным а также, оно действительно должно что-то делать, тогда должна быть возможность отличить (незашифрованный) открытый текст от (зашифрованного) зашифрованного текста.

Часто это несложно, потому что вы можете заставить функцию encrypt() пометить зашифрованный текст чем-то, чего просто не может быть в открытом тексте. Например, если открытый текст является текстом, а зашифрованный текст может содержать любые двоичные данные, то вы можете просто включить недопустимый символ в начале каждого зашифрованного текста.

Если нет структуры, которая может встречаться в зашифрованном тексте, но не может встречаться в открытом тексте, то вы можете еще выполнить эту работу, пометив зашифрованный текст тем, что не будет встречается в открытом тексте. Разумным способом было бы подписать зашифрованный текст тем же ключом, который вы используете для шифрования.

Тогда ваше идемпотентное расшифрование выглядит так:

idempotentDecrypt(ciphertext,key) {
    if (is_signed(ciphertext, key)) {
        return rawDecrypt(removeSignature(ciphertext),key)
    } else {
        return ciphertext;
    }
}

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

Обратите внимание, что ваш метод шифрования также должен быть идемпотентным — он должен оставлять уже зашифрованный зашифрованный текст в покое — или он должен отказываться шифровать то, что уже зашифровано.

я имею в виду, что я не думаю, что алгоритм шифрования должен идемпотентный, он может смешать его во что-то еще, если он расшифровывает оригинал за один шаг

user7898461 17.05.2019 07:25

Другие вопросы по теме