2010-10-27 32 views
10

我需要一些指针或实例来说明如何将int加密到另一个int,并且需要一个密钥来解密该值。对称整数到整数加密

喜欢的东西:

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

这家伙问几乎同样的问题:Symmetric Bijective Algorithm for Integers
但是我是一个总的加密“的n00b”如果可能的话,我想一些实际的例子,在蟒蛇。

我明白我需要使用某种类型的分组密码,但我敢失去了部分关于保持加密的结果仍然是数字的,有点短(可能是长期的,而不是一个int)

任何指针?谢谢

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

眼下,这些ID是连续的。我想隐藏它们是连续的(数据库ID)的事实。

的东西在这些网页是不是“最高机密”或类似的东西,但它不应该那么容易有人在其他一些随机”对象窥探刚刚递增该ID在URL中。

因此,通过某种双向数字加密,URL ID将不会是连续的,而且需要相当多的时间才能找到更多这些对象。 (此外,请求被扼杀)

而我想保留这个数字而不是一个任意字符串的唯一原因是,这样的变化是一个总的嵌入式替换,并且事情只会在没有任何其他代码更改的情况下工作。

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

+2

你为什么这样做?目标是什么?创建自己的密码非常危险。即使看似简单的事情,比如“只使用密码X”,也会产生意想不到的安全后果。 – 2010-10-27 00:13:34

+0

好点。我更新的问题 – adamJLev 2010-10-27 00:32:55

+0

[格式保留加密(http://en.wikipedia.org/wiki/Format-preserving_encryption) – 2010-10-27 01:05:21

回答

3

这取决于你想要的密码安全性。对于不太安全的(在加密意义上说 - 如果你不真的期望严重的攻击,那么对于日常使用来说可能是很好的),那么使用固定秘密密钥的XOR将起作用。请注意,它会受到一些相当基本的密码分析的影响。

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

然而,RC4有一些注意事项,所以请先阅读它。

块密码不会是你在这种情况下的朋友,因为他们都有一个64位或更多块大小。这意味着你需要垫您的32位整数位到64位,你会得到64位退了出来......但你不能选择其中32个保持。你将无法用只有一半的位来解密它。如果你很乐意移动多头,那么你可以使用3DES或Blowfish。

这一切都取决于正是您要加密,为什么,所以很难给出一个明确的答案。我希望这至少能让我们知道从哪里开始。

+1

用于64位分组密码。我在这里有一个代码示例:http://stackoverflow.com/questions/3569783/query-string-parameter-obfuscation/3571165#3571165也是一个64位整数表示为十六进制只有16个字符长,应该是罚款用于URL中。 – 2010-10-27 02:45:14

0

你想加密一个'int'即q 32/64位数?
然后最简单的方法就是将它与32/64位密钥异或。

+0

或者,用较小的键,重复了数跨度XOR它。 – 2010-10-27 00:08:08

+0

这个代码看起来怎么样,或多或少? – adamJLev 2010-10-27 00:08:49

+0

小心直xor因为然后只有64个例子有一个机会,用户可以找出关键。 – 2010-10-27 00:10:12

1

你可以看看本文:Perfect Block Ciphers with Small Blocks和演示文稿的the slides在FSE 2007年会议。

本文说明如何随机地选择n个元素的置换(例如,0和n-1之间的整数),它可以被看作是这组n个元素的密码。

1

我张贴到这个问题的答案适用于你还有:使用短分组密码。假设您的标识符为64位,实际上,您可以简单地使用XTEA密码,并以64位整数作为数据块。

+0

听起来不错,XTEA的代码看起来很简单,可以很容易地移植到python。 Thx我会给这个镜头 – adamJLev 2010-10-27 14:28:37

0

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