是否有一个幂等的简单解密算法? 像这样:
decrypt(encrypt(x)) === x === decrypt(decrypt(decrypt(encrypt(x))))
答案 0 :(得分:5)
假设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
的定义。
答案 1 :(得分:3)
这是另一种选择(但接受OmG的回答)。
解密函数必须是内射的,否则它是无用的。
您希望解密功能是幂等的。
唯一幂等内射函数是恒等函数。证明:令f为幂等和内射的。然后根据幂等的定义,f(f(x))= f(x)。现在,由于f是单射性的,所以f(x)映射到f(x),对于所有x,所以嘿,那是恒等函数。 Q.E.D。
身份函数是对您的问题“是否有幂等的简单解密算法?”的肯定答案。
但是,身份功能不是真正的解密功能,因为它暗示密文和消息必须相同,因此在实践中这是完全无用的,在这种情况下,对您问题的最佳答案是“不。”
答案 2 :(得分:1)
如果解密必须是幂等的,并且实际上必须做某事,那么必须有可能将(未加密的)明文与(加密的)密文区分开。
通常这很容易,因为您可以使用crypto()函数将密文标记为纯文本中不会出现的内容。例如,如果明文是文本,但是密文可以包含任何二进制数据,那么您可以在每个密文的开头仅包含一个无效字符。
如果在密文中没有可以出现的结构,但是在明文中却没有,那么您可以仍然通过用获胜的东西标记密文来完成这项工作。 t 以明文形式出现。合理的方法是使用与加密相同的密钥对密文进行数字签名。
然后您的幂等解密就像:
idempotentDecrypt(ciphertext,key) {
if (is_signed(ciphertext, key)) {
return rawDecrypt(removeSignature(ciphertext),key)
} else {
return ciphertext;
}
}
当然,有机会偶然发现一些未加密的纯文本有效签名,但是这种机会很小,而且如果您的签名算法很好,那么您就不必为此担心。 / p>
请注意,您的加密方法也必须是幂等的-它必须保留已加密的密文本身-否则必须拒绝加密已加密的事物。