幂等的解密例程/算法

时间:2019-05-15 01:48:08

标签: algorithm encryption idempotent

是否有一个幂等的简单解密算法? 像这样:

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

3 个答案:

答案 0 :(得分:5)

假设decrypt是函数f,而encrypt是函数g。因此,我们有f(g(x)) = xf(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)是双射的,则意味着fg的逆。因此,g(x) = x

此外,如果我们没有函数g的双射假设(距离还不算太远!),从g(g(x)) = x开始,我们发现对于所有输入x,函数将g(x)的值映射到自身。因此,g(x) = x的定义。

答案 1 :(得分:3)

这是另一种选择(但接受OmG的回答)。

  1. 解密函数必须是内射的,否则它是无用的。

  2. 您希望解密功能是幂等的。

  3. 唯一幂等内射函数是恒等函数。证明:令f为幂等和内射的。然后根据幂等的定义,f(f(x))= f(x)。现在,由于f是单射性的,所以f(x)映射到f(x),对于所有x,所以嘿,那是恒等函数。 Q.E.D。

  4. 身份函数是对您的问题“是否有幂等的简单解密算法?”的肯定答案。

  5. 但是,身份功能不是真正的解密功能,因为它暗示密文和消息必须相同,因此在实践中这是完全无用的,在这种情况下,对您问题的最佳答案是“不。”

答案 2 :(得分:1)

如果解密必须是幂等的,并且实际上必须做某事,那么必须有可能将(未加密的)明文与(加密的)密文区分开。

通常这很容易,因为您可以使用crypto()函数将密文标记为纯文本中不会出现的内容。例如,如果明文是文本,但是密文可以包含任何二进制数据,那么您可以在每个密文的开头仅包含一个无效字符。

如果在密文中没有可以出现的结构,但是在明文中却没有,那么您可以仍然通过用获胜的东西标记密文来完成这项工作。 t 以明文形式出现。合理的方法是使用与加密相同的密钥对密文进行数字签名。

然后您的幂等解密就像:

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

当然,有机会偶然发现一些未加密的纯文本有效签名,但是这种机会很小,而且如果您的签名算法很好,那么您就不必为此担心。 / p>

请注意,您的加密方法必须是幂等的-它必须保留已加密的密文本身-否则必须拒绝加密已加密的事物。