Существует ли простой алгоритм дешифрования, который является идемпотентным? Что-то вроде этого:
decrypt(encrypt(x)) === x === decrypt(decrypt(decrypt(encrypt(x))))
Не могли бы вы просто определить, было ли что-то расшифровано, а затем вернуть идентификатор, если это уже было?
Но тогда decrypt(encrypt(x)) не может быть произвольным x
@MaartenBodewes не мог ли алгоритм расшифровки сделать это, поэтому мне не нужно?
@RayToal Э-э, да, но скажите, что x — это произвольное значение n бит, и что c = encrypt(x) также является произвольным значением n бит. Тогда выше не будет работать, верно? Обратите внимание, что у потоковых шифров есть свойство encrypt === decrypt, поэтому любое четное количество шифрований и расшифровок вернет открытый текст.
№ (это место намеренно оставлено пустым)
@OlegzandrDenman Боюсь, вы, возможно, ограничили свои ответы чисто теоретическими, так строго определив свою проблему - это практическая проблема, которую вы пытаетесь решить?
Я согласен с @LukeJoshuaPark. Для всех практических применений эта проблема тривиальна. Добавьте заголовок к зашифрованным данным. Как только вы сделаете его бесполезным форматом (т. е. удалите заголовок), вы сделаете его невозможным, но также сделаете его плохим криптографическим форматом для большинства применений.





Предположим, что 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 по определению.
Тогда, наверное, нет :)
Отличное резюме!
Я не знаю об этом - простой алгоритм дешифрования может «прикрепить» «а» впереди, тогда, если алгоритм дешифрования, такой как «а» в начале, просто вернет ввод. Просто нужно добавить немного информации.
Если алгоритм дешифрования прикрепляет «а» впереди, то расшифровать (зашифровать (x)) не может быть x, потому что вы прикрепили «а» впереди. ОП сказал, что они хотят, чтобы расшифровка (шифрование (x)) была равна x. Вы не сможете этого сделать, если прикрепите лишние вещи. Если OP ослабит ограничение, то, возможно, вы сможете добавить дополнительную информацию о том, что значение уже было расшифровано, но это должно быть за пределами исходного сообщения, а не его частью.
правда - с этим согласен
Вот еще один вариант (но примите ответ OmG).
Функция расшифровки должна быть инъективной, иначе она бесполезна.
Вы хотите, чтобы функция расшифровки была идемпотентной.
только идемпотентная инъективная функция является тождественной функцией. Доказательство. Пусть f идемпотентна и инъективна. Тогда по определению идемпотента f (f (x)) = f (x). Теперь, поскольку f инъективно, f(x) отображается в f(x) для всех x, так что эй, это функция тождества. КЭД
Функция тождества является утвердительным ответом на ваш вопрос «Существует ли простой алгоритм дешифрования, который является идемпотентным?»
ОДНАКО функция идентификации не является реальной функцией дешифрования, потому что она подразумевает, что зашифрованный текст и сообщение должны быть одинаковыми, так что на практике это совершенно бесполезно, и в этом случае лучший ответ на ваш вопрос — «нет».
Если дешифрование должно быть идемпотентным а также, оно действительно должно что-то делать, тогда должна быть возможность отличить (незашифрованный) открытый текст от (зашифрованного) зашифрованного текста.
Часто это несложно, потому что вы можете заставить функцию encrypt() пометить зашифрованный текст чем-то, чего просто не может быть в открытом тексте. Например, если открытый текст является текстом, а зашифрованный текст может содержать любые двоичные данные, то вы можете просто включить недопустимый символ в начале каждого зашифрованного текста.
Если нет структуры, которая может встречаться в зашифрованном тексте, но не может встречаться в открытом тексте, то вы можете еще выполнить эту работу, пометив зашифрованный текст тем, что не будет встречается в открытом тексте. Разумным способом было бы подписать зашифрованный текст тем же ключом, который вы используете для шифрования.
Тогда ваше идемпотентное расшифрование выглядит так:
idempotentDecrypt(ciphertext,key) {
if (is_signed(ciphertext, key)) {
return rawDecrypt(removeSignature(ciphertext),key)
} else {
return ciphertext;
}
}
Конечно, есть шанс, что какой-то незашифрованный открытый текст может оказаться действительно подписанным просто случайно, но этот шанс исчезающе мал, и если ваш алгоритм подписи хорош, вам не о чем беспокоиться.
Обратите внимание, что ваш метод шифрования также должен быть идемпотентным — он должен оставлять уже зашифрованный зашифрованный текст в покое — или он должен отказываться шифровать то, что уже зашифровано.
я имею в виду, что я не думаю, что алгоритм шифрования должен идемпотентный, он может смешать его во что-то еще, если он расшифровывает оригинал за один шаг
Я не думаю, что у вас может быть что-то биективное и идемпотентное, кроме тождества.