幂等解密routine/algorithm
Idempotent decryption routine/algorithm
有没有简单的幂等解密算法?
像这样:
decrypt(encrypt(x)) === x === decrypt(decrypt(decrypt(encrypt(x))))
假设 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
。
这是另一个观点(但请接受 OmG 的回答)。
解密函数必须是单射的,否则没用
你希望解密函数是幂等的
唯一的幂等内射函数是恒等函数。证明:设 f 是幂等且单射的。那么根据幂等的定义,f(f(x)) = f(x)。现在因为 f 是单射的,对于所有 x,f(x) 映射到 f(x),所以嘿,这就是恒等函数。 Q.E.D.
恒等函数是对你问题的肯定回答"Is there a simple decryption algorithm that is idempotent?"
HOWEVER,身份函数不是真正的解密函数,因为这意味着密文和消息一定是一样的,所以在实践中完全没有用,这种情况下,最好你问题的答案是 "no."
如果解密必须是幂等的并且它实际上必须做一些事情,那么它必须能够区分(未加密的)明文和(加密的)密文。
通常这很容易,因为您可以让 encrypt() 函数用明文中无法出现的内容标记密文。例如,如果明文是文本,但密文可以包含任何二进制数据,那么您可以在每个密文的开头包含一个无效字符。
如果没有结构可以出现在密文中,但不能出现在明文中,那么你可以仍然通过用一些东西标记密文来完成这项工作不会以明文形式出现。一种合理的方法是使用您用于加密的相同密钥对密文进行数字签名。
那么你的幂等解密就是这样:
idempotentDecrypt(ciphertext,key) {
if (is_signed(ciphertext, key)) {
return rawDecrypt(removeSignature(ciphertext),key)
} else {
return ciphertext;
}
}
当然有可能一些未加密的明文偶然被有效签名,但这种机会微乎其微,如果你的签名算法很好,那么你真的不必担心它.
请注意,您的加密方法 也 必须是幂等的——它必须单独保留 already-encrypted 密文——否则它必须拒绝加密已经加密的东西.
有没有简单的幂等解密算法? 像这样:
decrypt(encrypt(x)) === x === decrypt(decrypt(decrypt(encrypt(x))))
假设 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
。
这是另一个观点(但请接受 OmG 的回答)。
解密函数必须是单射的,否则没用
你希望解密函数是幂等的
唯一的幂等内射函数是恒等函数。证明:设 f 是幂等且单射的。那么根据幂等的定义,f(f(x)) = f(x)。现在因为 f 是单射的,对于所有 x,f(x) 映射到 f(x),所以嘿,这就是恒等函数。 Q.E.D.
恒等函数是对你问题的肯定回答"Is there a simple decryption algorithm that is idempotent?"
HOWEVER,身份函数不是真正的解密函数,因为这意味着密文和消息一定是一样的,所以在实践中完全没有用,这种情况下,最好你问题的答案是 "no."
如果解密必须是幂等的并且它实际上必须做一些事情,那么它必须能够区分(未加密的)明文和(加密的)密文。
通常这很容易,因为您可以让 encrypt() 函数用明文中无法出现的内容标记密文。例如,如果明文是文本,但密文可以包含任何二进制数据,那么您可以在每个密文的开头包含一个无效字符。
如果没有结构可以出现在密文中,但不能出现在明文中,那么你可以仍然通过用一些东西标记密文来完成这项工作不会以明文形式出现。一种合理的方法是使用您用于加密的相同密钥对密文进行数字签名。
那么你的幂等解密就是这样:
idempotentDecrypt(ciphertext,key) {
if (is_signed(ciphertext, key)) {
return rawDecrypt(removeSignature(ciphertext),key)
} else {
return ciphertext;
}
}
当然有可能一些未加密的明文偶然被有效签名,但这种机会微乎其微,如果你的签名算法很好,那么你真的不必担心它.
请注意,您的加密方法 也 必须是幂等的——它必须单独保留 already-encrypted 密文——否则它必须拒绝加密已经加密的东西.