【问题标题】:Simple integer encryption简单整数加密
【发布时间】:2010-05-04 23:03:38
【问题描述】:

有加密整数的简单算法吗?也就是说,一个函数 E(i,k) 接受一个 n 位整数和一个密钥(任何类型)并产生另一个不相关的 n 位整数,当输入第二个函数 D(E(i) 时, k) (连同键)产生原始整数?

显然,您可以执行一些简单的可逆操作,但它们似乎都会产生明显相关的输出(例如,连续输入导致连续输出)。此外,当然,还有加密强大的标准算法,但它们不会产生足够小的输出(例如 32 位)。我知道任何 32 位密码术都可以被暴力破解,但我不是在寻找密码学上强大的东西,只是看起来随机的东西。理论上应该是可以的;毕竟,我可以通过随机配对每个整数来创建字典。但我希望内存占用少一些。

编辑:感谢您的回答。简单的 XOR 解决方案将不起作用,因为相似的输入会产生相似的输出。

【问题讨论】:

    标签: algorithm language-agnostic cryptography


    【解决方案1】:

    这不等于块大小 = 32 位的Block Cipher 吗?

    不是很受欢迎,因为它很容易破解。但理论上可行。 这是 Perl 中的一种实现: http://metacpan.org/pod/Crypt::Skip32

    更新:另见Format preserving encryption

    更新 2:RC5 支持 32-64-128 位的块大小

    【讨论】:

    • 是的,但我不知道在如此小的块大小上运行的任何块密码。
    • 啊,Skip32 似乎就是我要找的东西。它可以推广到 n 位块吗?
    • 不,它似乎无法概括。而且这似乎不是一个小问题。
    【解决方案2】:

    我前段时间写了an article,关于如何从分组密码生成“加密安全排列”,这听起来像你想要的。它涵盖了使用折叠来减小分组密码的大小,以及处理非 2 次幂范围的技巧。

    【讨论】:

    • 谢谢,写得很好。听起来像是 leonbloy 链接的文章中的循环行走算法。
    • 循环行走,结合折叠技术来减少分组密码的长度。
    【解决方案3】:

    一个简单的:

    rand = new Random(k);
    return (i xor rand.Next())
    

    (与rand.Next() 而不是k 的异或点是否则,给定iE(i,k),您可以通过k = i xor E(i,k) 得到k

    【讨论】:

      【解决方案4】:

      Ayden 是我开发的一种算法。它紧凑、快速且看起来非常安全。它目前可用于 32 位和 64 位整数。它属于公共领域,您可以从http://github.com/msotoodeh/integer-encoder 获得它。

      【讨论】:

        【解决方案5】:

        您可以获取密钥的 n 位散列(假设它是私有的)并将该散列与原始整数进行异或运算以进行加密,并与加密的整数进行解密。

        可能在密码学上不可靠,但根据您的要求,可能就足够了。

        【讨论】:

          【解决方案6】:

          如果您只是想看起来随机且不关心安全性,那么只需交换位如何。您可以简单地反转位串,使高位变为低位、次高位、次低位等,或者您可以进行一些其他随机排列(例如 1 到 4、2 到 7、3 到 1 等)。

          【讨论】:

            【解决方案7】:

            用一两个素数对它进行异或运算怎么样?尝试分析时,交换位似乎非常随机。
            尝试在移位后将其与素数和自身进行异或。

            【讨论】:

              【解决方案8】:

              您要加密多少个整数?您要处理多少关键数据?

              如果您要加密的项目很少,并且您愿意处理与要加密的数据一样长的关键数据,那么一次性便笺本非常简单(只需 XOR 操作)并且数学上牢不可破。

              缺点是密钥保密的问题与数据保密的问题差不多。

              它也有一个缺陷(每当有人决定尝试使用它时就会一次又一次地遇到),如果你使用 any 快捷方式 - 比如使用非随机键或常用键使用有限长度的密钥并回收它——它变成了现有的最弱密码。嗯,可能ROT13比较弱。

              但是说真的,如果您要加密一个整数,那么无论您决定使用哪种密码,您都将如何处理密钥?保持密钥秘密将是一个与保持整数秘密一样大(或更大)的问题。如果您要加密一堆整数,只需使用标准的、经过同行评审的密码,就像您在许多加密库中可以找到的那样。

              RC4 将产生尽可能少的输出,因为它是一种流密码。

              【讨论】:

              • RC5 是分组密码;你可能会想到 RC4。
              • 保持密钥机密不会成为问题,但对于无限数量的整数,每次都必须是 same 密钥。我相信这意味着对于一次性填充类型的加密,密钥需要与每个整数的串联一样长。虽然我不介意大键,但它们可能应该是整数长度的顺序。
              【解决方案9】:

              与 /dev/random 异或

              【讨论】:

                猜你喜欢
                • 2010-09-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-01-31
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多