【问题标题】:Symmetric integer to integer encryption对称整数到整数加密
【发布时间】:2011-05-01 01:11:38
【问题描述】:

我需要一些关于如何将一个 int 加密为另一个 int 的指针或实际示例,并且需要一个密钥来解密该值。

类似:

encrypt(1, "secret key") == 67123571122
decrypt(67123571122, "secret key") == 1

这个人问了几乎相同的问题:Symmetric Bijective Algorithm for Integers
但是我是一个完全加密的“n00b”我想要一些更实际的例子,如果可能的话,在 python 中。

我知道我需要使用某种分组密码,但我对保持加密结果仍然是数字且有点短(可能是长而不是 int)感到很迷茫

有什么建议吗?谢谢

更新- 我为什么要这样做?
我有一个网络服务,其中每个“对象”都有一个 URL,例如: example.com/thing/123456/

现在,这些 ID 是连续的。我想隐藏它们是顺序的(数据库 ID)这一事实。

这些页面上的内容不是“最高机密”或类似的东西,但是对于某人来说,窥探其他一些随机对象并不像在 URL 中增加该 ID 那样容易。

因此,使用某种双向数字加密,URL ID 根本不会是连续的,并且需要花费相当多的时间才能找到更多这样的对象。 (此外,请求会受到限制)

我想保留这个数字而不是任意字符串的唯一原因是这样更改是完全的直接替换,并且无需任何其他代码更改就可以正常工作。

另外,我不能只生成新的随机数据库 ID。我必须在应用程序中处理这个加密/解密。

【问题讨论】:

  • 你为什么要这样做?目标是什么?创建自己的密码学是非常危险的。即使像“只使用密码 X”这样看似简单的事情也会产生意想不到的安全后果。
  • 好点。我更新了问题

标签: python security encryption cryptography obfuscation


【解决方案1】:

您只想加密一个“int”,即 q 32/64 位数字?
那么最简单的方法就是用 32/64 位密钥对它进行 XOR。

【讨论】:

  • 或者,用较小的键异或,在数字的范围内重复。
  • 小心异或,因为只有 64 个例子,用户就有机会找出关键。
  • 另请注意,如果您只有一对加密/解密的密钥,那么获取密钥变得很简单。
  • @Mike: Xor 相同长度的密钥是 OTP 的定义。当然你不想重复使用密钥。
  • @Knitti:鉴于发帖人提到了“crypto”和“n00b”,你可能想解释一下 OTP……我猜你的意思是“一次性密码”。
【解决方案2】:

这取决于您想要的加密安全程度。对于不太安全的情况(在加密意义上——如果你真的不期待严重的攻击,可能适合日常使用),那么使用固定密钥的 XOR 将起作用。请注意,它很容易受到一些相当基本的密码分析。

如果您想要真正的加密,您可能必须使用像 RC4 这样的流密码。您可以获取 32 位密钥流并将其与您的值进行异或以对其进行加密。只要您为每个值获得一个新的 32 位密钥流就可以了。

但是,RC4 有一些注意事项,因此请先阅读它。

在这种情况下,块密码不会成为您的朋友,因为它们的块大小都为 64 位或更大。这意味着您需要将 32 位整数填充到 64 位,然后您将得到 64 位……但您无法选择保留哪 32 位。您将无法仅用一半的位对其进行解密。如果您乐于使用 longs,则可以使用 3DES 或 Blowfish。

这完全取决于您要加密的内容和原因,因此很难给出明确的答案。我希望这至少能说明从哪里开始。

【讨论】:

  • +1 表示 64 位分组密码。我在这里有一个代码示例:stackoverflow.com/questions/3569783/… 同样,以十六进制表示的 64 位整数只有 16 个字符长,应该可以在 URL 中使用。
【解决方案3】:

您可以查看这篇论文:Perfect Block Ciphers with Small Blocksthe slides 在 FSE 2007 会议上的演示文稿。

本文解释了如何随机选择 n 个元素的排列(例如 0 和 n-1 之间的整数),这可以被视为这组 n 个元素的密码。

【讨论】:

    【解决方案4】:

    我针对该问题发布的答案也适用于您的问题:使用短分组密码。假设您的标识符是 64 位,实际上,您可以简单地使用 XTEA 密码,将 64 位整数作为数据块。

    【讨论】:

    • 听起来不错,XTEA 的代码看起来很简单,可以轻松移植到 python。谢谢,我会试一试
    【解决方案5】:

    简单的异或不能称为加密。混淆是一个更合适的词。 我开发了一种紧凑、快速且安全的算法,我称之为 Ayden。它位于公共领域和can be downloaded from Github。希望有用。

    【讨论】:

      猜你喜欢
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多