这是我的简单想法:
您可以像PeterK建议的那样移动数字的位,但是您可以为每个数字拥有不同的位排列,并且仍然能够解密它。
密码如下:
将输入数字视为位数组I [0..31]
,输出为O [0..31]
。
准备一个由64个随机生成数字组成的数组K [0..63]
。 这将是您的密钥。
从第一个随机数(I [K [0] mod 32]
)确定的位置中获取输入数字的位,并将其放置在结果的开头(O [0]
)。 现在要决定在O [1]
处放置哪个位,请使用先前使用的位。 如果它是0,则使用K [1]生成I
中要取的位置,如果它是1,则使用K [2](这只是意味着跳过一个随机数)。
现在这样做不好,因为你可能会重复取同一位。为了避免这种情况,在每次迭代后重新编号位,省略已使用的位。要生成从中取O[1]
的位置,请使用I[K[p] mod 31]
,其中p为1或2,具体取决于位O[0]
,因为还剩下31个位,从0到30编号。
为了说明这一点,我将举一个例子:
我们有一个4位数和8个随机数:25、5、28、19、14、20、0、18。
I: 0111 O: ____
_
25 mod 4 = 1,因此我们将获取位置为1的位(从0开始计数)
I: 0_11 O: 1___
_
我们刚刚取了一个值为1的位,所以我们跳过一个随机数并使用28。还剩下3位,因此为了计算位置,我们取28 mod 3 = 1。我们取剩余位中的第一个(从0开始计数):
I: 0__1 O: 11__
_
再次跳过一个数字,取14。 14 mod 2 = 0,因此我们取第0位:
I: ___1 O: 110_
_
现在这不重要,但是前面的位是0,所以我们取20。20 mod 1 = 0:
I: ____ O: 1101
就是这样。
解密这样的数字很容易,只需要做相同的事情。从密钥中可以确定代码的第一个位应该放置在哪个位置,接下来的位置由先前插入的位决定。
显然,这种方法具有将位移动的任何缺点(例如0变成0,MAXINT变成MAXINT),但是似乎更难找到某人在不知道密钥的情况下如何加密该数字,而密钥必须保密。