代码之家  ›  专栏  ›  技术社区  ›  tloflin

简单整数加密

  •  4
  • tloflin  · 技术社区  · 14 年前

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

    显然有一些简单的可逆操作你可以执行,但他们似乎都产生明确相关的输出(例如,连续的输入导致连续的输出)。当然,也有加密性很强的标准算法,但它们不能产生足够小的输出(例如32位)。我知道任何32位的密码都是可以强制执行的,但我并不是在寻找一种强大的密码技术,而是一种 随机的。从理论上讲,这应该是可能的;毕竟,我可以通过随机配对每个整数来创建一个字典。但我希望能少一些记忆密集型的东西。

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

    9 回复  |  直到 6 年前
        1
  •  9
  •   szabgab Brandon Fosdick    10 年前

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

    不太受欢迎,因为很容易打破。但在理论上是可行的。 下面是一个Perl实现: http://metacpan.org/pod/Crypt::Skip32

    更新:另请参见 Format preserving encryption

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

        2
  •  3
  •   Nick Johnson    14 年前

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

        3
  •  1
  •   BlueRaja - Danny Pflughoeft    14 年前

    一个简单的例子:

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

    (与 rand.Next() 而不是 k 如果不是的话 i E(i,k) ,你可以得到 K 通过 k = i xor E(i,k) )

        4
  •  1
  •   Luca C.    6 年前

    艾登是我开发的一个算法。它小巧,速度快,看起来很安全。它目前可用于32位和64位整数。它在公共领域,你可以从 http://github.com/msotoodeh/integer-encoder

        5
  •  0
  •   Eric J.    14 年前

    您可以对密钥进行n位散列(假设它是私有的)并使用原始整数对该散列进行xor加密,使用加密整数对其进行解密。

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

        6
  •  0
  •   bdk    14 年前

    如果你只是想看起来随机,不在乎安全,那就换个位子吧。您可以简单地反转位串,使高位变为低位、第二高位、第二低位等,也可以进行其他一些随机排列(如1到4、2到73到1等)。

        7
  •  0
  •   Rubys    14 年前

    用一个或两个素数对它进行异或运算怎么样?在试图分析它时,交换位看起来非常随机。
    试着用一个素数和它本身在比特移位后进行异或运算。

        8
  •  0
  •   Michael Burr    14 年前

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

    如果要加密的项很少,并且愿意处理与要加密的数据一样长的密钥数据,那么一次性pad就非常简单(只是一个xor操作),在数学上是不可破解的。

    缺点是,密钥保密的问题和数据保密的问题差不多大。

    它还有一个缺陷(每当有人决定尝试使用它时,它会一次又一次地运行)如果你 任何 快捷方式-像使用非随机密钥或使用有限长度密钥并将其循环使用的常见快捷方式-使其成为存在的最弱密码。好吧,也许rot13比较弱。

    但严肃地说,如果你正在加密一个整数,不管你决定使用哪一个密码,你都要用这个密钥做什么?保持密钥机密将是一个与保持整数机密一样大(或更大)的问题。如果你正在加密一堆整数,只需使用一个标准的,经过同行评审的密码,就像你在许多密码库中找到的一样。

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

        9
  •  0
  •   Liberius    14 年前

    与/dev/random异或