对称整数加密
我需要一些建议或者实际的例子,关于如何把一个整数加密成另一个整数,并且需要一个秘密钥匙来解密这个值。
类似于:
encrypt(1, "secret key") == 67123571122
decrypt(67123571122, "secret key") == 1
这个人问的几乎是同样的问题:整数的对称双射算法
不过我对加密完全是个新手,所以我希望能有一些更实际的例子,最好是用python来写。
我知道我需要使用某种块加密算法,但我对如何保持加密结果仍然是数字且相对较短(可能用长整型而不是整型)这部分感到很困惑。
有什么建议吗?谢谢!
更新-我为什么想这么做?
我有一个网络服务,每个“对象”都有一个网址,例如:
example.com/thing/123456/
现在,这些ID是顺序的。我想隐藏它们是顺序的(数据库ID)。
这些页面上的内容并不是“绝对机密”之类的,但我不希望别人通过简单地在网址中增加ID来轻易找到其他随机的对象。
所以通过某种双向的数字加密,网址的ID就不会是顺序的,别人要找到更多这样的对象会花费不少时间。(另外,请求是有限制的)
我想保持这个数字格式,而不是随便的字符串,是因为这样可以完全替换,其他代码就不需要改动,依然可以正常工作。
而且,我不能随便生成新的随机数据库ID。我必须在应用程序中处理这个加密/解密。
5 个回答
我之前给那个问题的回答也适用于你的问题:使用一个短的块加密算法。假设你的标识符是64位的,实际上你可以直接使用XTEA加密算法,使用一个64位的整数作为数据块。
这要看你想要多安全了。如果你只需要一般的安全性(在加密的意义上——如果你不担心会受到严重攻击,这种方法大致可以用),那么用一个固定的秘密钥匙进行异或(XOR)运算就可以了。不过要注意,这种方法对一些基本的密码分析是有漏洞的。
如果你想要真正的加密,可能需要使用像RC4这样的流密码。你可以获取32位的密钥流,然后用它和你的值进行异或运算来加密。只要每次都能得到新的32位密钥流,你就没问题。
不过,RC4也有一些注意事项,所以最好先了解一下。
在这种情况下,块密码就不太适合了,因为它们的块大小都是64位或更多。这意味着你需要把32位的整数填充到64位,然后你会得到64位的输出……但你不能选择保留哪32位。如果只有一半的位数,你是无法解密的。如果你愿意使用更长的数值类型,那么可以考虑3DES或Blowfish。
这完全取决于你具体要加密什么以及为什么要加密,所以很难给出一个明确的答案。希望这能给你一个开始的方向。