顺序数字混淆拼图网站


Sequential number obfusication for puzzle site

我在一个生成随机谜题的网站上工作,确切的谜题可以使用这个数字重新创建。所以我给他们这个谜题的url以防他们想和朋友分享或者以后解决它somepuzzlesite.com/4233312409408127365会生成一个独特的谜题如果他们使用这个链接/数字

我不想暴露谜题是如何生成的。例如,第9位数字可以是0到3,并定义谜题的旋转。

如果我只是使用"原样",那么用户可以更改url中的单个数字,查看更改内容,并最终发现我如何制作谜题。我也不介意我的数字小一点,因为我不需要一直写到9:

第1 ~ 8位数字[取值范围0 ~ 5]

数字9 [value 0 ~ 3]

数字11到20表示10个对象按顺序排列。我可以按顺序指定前9个对象,然后假设未提及的项是最后一个。(这使我减少到使用9个数字)

我可以改变基数,或者在URL中除了数字外还使用字母,但是一些字母总是很麻烦——小写字母"L"answers"1"很容易混淆,"0"answers"0"也很容易混淆。

但为了使问题简单,我只是想改变一个数字就会表示一个完全不同的数字,从而产生一个完全不同的谜题,而不是如果我只改变一个因素就会产生微小的差异。

让我看看…一种相当幼稚的方法是:为每个值分配必要的位数来保存它。也就是说,您将拥有8个3位值、1个2位值和10个4位值。也就是8*3+2+10*4=66位。如果你跳过最后一个,你会得到62位。你可以把它弄得更小,但这会变得不必要的复杂。

取任何标准的加密算法并将其应用于这62位。行业标准AES(又名Rijndael)在128位块上运行,这可能有点太长了,也可能不是,这取决于您的偏好。3DES对于您的目的来说不会更差,并且可以在64位块上工作,这是完美的。

当你得到加密的64位或128位时,只需对它们进行十六进制编码并使其成为URL。如果是64位,则有16个十六进制字符。不要太多。而且你也很难再往下走了。另外,它只使用0-9,A-F,并且在打电话时几乎没有混淆的机会。现在人们并不经常口头分享链接。: P

您的号码大约是18位或61-62位的大小。这意味着它可以很好地放在一个DES块中(8字节或64位)。如果你在ECB模式下加密它,你会得到一个64位的值,它看起来像一个随机值。你可以把钥匙留在服务器上。对于混淆,单个8字节的DES密钥应该足够了,但您也可以使用16/24字节的密钥进行DESede加密。

所以:当生成一个新的随机谜题时:创建你的数字,将它转换成一个长度为8字节的字节数组(如果你的数字太大,则转换为N * 8字节),然后用保存在服务器上的单个密钥(8,16或24个随机生成的字节)和一些备份加密它。结果将再次是8字节,您可以将其转换为大约20位数字。如果用户提供了先前生成的数字,您可以使用服务器上的密钥对其解密,将生成的字节还原为用于创建谜题的数字。

请注意,如果用户只是输入一些随机数,它仍然会解密,所以你可能想要检查结果数的有效性(例如,测试一个数字是否确实是0..

解决这个问题的另一种方法是在内部保存谜题,并将谜题绑定到唯一的ID。