Если дешифрование должно быть идемпотентным и , оно действительно должно что-то делать, тогда должна быть возможность отличить (незашифрованный) открытый текст от (зашифрованного) зашифрованного текста.
Часто это легкопотому что у вас может быть функция encrypt () помечает зашифрованный текст чем-то, чего просто не может быть в открытом тексте.Если открытый текст является, например, текстом, но зашифрованный текст может содержать любые двоичные данные, то вы можете просто включить недопустимый символ в начале каждого зашифрованного текста.
Если в зашифрованном тексте нет структуры, которая может встречаться,но не может появиться в открытом тексте, тогда вы можете все же выполнить работу, пометив зашифрованный текст чем-то, что не будет появляться в открытом тексте.Разумным способом было бы поставить цифровую подпись зашифрованного текста тем же ключом, который вы используете для шифрования.
Тогда ваше идемпотентное дешифрование будет выглядеть так:
idempotentDecrypt(ciphertext,key) {
if (is_signed(ciphertext, key)) {
return rawDecrypt(removeSignature(ciphertext),key)
} else {
return ciphertext;
}
}
Конечно, есть вероятность, что некоторыенезашифрованный открытый текст может оказаться случайно подписанным, но этот шанс невероятно мал, и если ваш алгоритм подписи хорош, вам не нужно об этом беспокоиться.
Обратите внимание, что ваш метод шифрования также должен быть идемпотентом - он должен оставлять уже зашифрованный зашифрованный текст в одиночку - или он должен отказаться от шифрования уже зашифрованных вещей.