对称整数加密

11 投票
5 回答
5737 浏览
提问于 2025-04-16 06:08

我需要一些建议或者实际的例子,关于如何把一个整数加密成另一个整数,并且需要一个秘密钥匙来解密这个值。

类似于:

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

这个人问的几乎是同样的问题:整数的对称双射算法
不过我对加密完全是个新手,所以我希望能有一些更实际的例子,最好是用python来写。

我知道我需要使用某种块加密算法,但我对如何保持加密结果仍然是数字且相对较短(可能用长整型而不是整型)这部分感到很困惑。

有什么建议吗?谢谢!

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

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

这些页面上的内容并不是“绝对机密”之类的,但我不希望别人通过简单地在网址中增加ID来轻易找到其他随机的对象。

所以通过某种双向的数字加密,网址的ID就不会是顺序的,别人要找到更多这样的对象会花费不少时间。(另外,请求是有限制的)

我想保持这个数字格式,而不是随便的字符串,是因为这样可以完全替换,其他代码就不需要改动,依然可以正常工作。

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

5 个回答

1

你可以看看这篇论文:小块的完美块密码,还有在FSE 2007会议上展示的幻灯片

这篇论文讲的是如何随机选择n个元素的排列(比如说从0到n-1的整数),这些排列可以看作是对这n个元素的一种加密方式。

1

我之前给那个问题的回答也适用于你的问题:使用一个短的块加密算法。假设你的标识符是64位的,实际上你可以直接使用XTEA加密算法,使用一个64位的整数作为数据块。

4

这要看你想要多安全了。如果你只需要一般的安全性(在加密的意义上——如果你不担心会受到严重攻击,这种方法大致可以用),那么用一个固定的秘密钥匙进行异或(XOR)运算就可以了。不过要注意,这种方法对一些基本的密码分析是有漏洞的。

如果你想要真正的加密,可能需要使用像RC4这样的流密码。你可以获取32位的密钥流,然后用它和你的值进行异或运算来加密。只要每次都能得到新的32位密钥流,你就没问题。

不过,RC4也有一些注意事项,所以最好先了解一下。

在这种情况下,块密码就不太适合了,因为它们的块大小都是64位或更多。这意味着你需要把32位的整数填充到64位,然后你会得到64位的输出……但你不能选择保留哪32位。如果只有一半的位数,你是无法解密的。如果你愿意使用更长的数值类型,那么可以考虑3DES或Blowfish。

这完全取决于你具体要加密什么以及为什么要加密,所以很难给出一个明确的答案。希望这能给你一个开始的方向。

撰写回答