我正在开发一个生成随机拼图的网站,可以使用此编号重新创建拼图。所以我给他们提供拼图的网址,以防他们想与朋友分享或稍后解决等等。如果他们使用该链接/号码,那么somepuzzlesite.com/4233312409408127365会产生一个独特的拼图。 >
我不想要的是揭示拼图是如何生成的。例如,第9位可以是0到3,并定义拼图的旋转。
如果我“按原样”使用它,那么用户可以更改网址中的单个数字,查看更改内容,并最终了解我如何制作拼图。我也不介意我的号码是否较小,因为我不需要一直到9:
数字1到8 [可能值0到5]
数字9 [值0到3]
数字11到20表示按顺序排列10个对象。 我可以按顺序指定前9个对象,然后假设未提及的项目是最后一个。 (这让我使用了9位数)
我可以更改基数,或者除了数字之外在我的URL中使用字母字符,但是一些字母字符总是有问题 - 小写“L”和“1”容易混淆,“o”和零也可以
但为了保持简单的问题,我只想做到这一点,以便改变一个数字代表一个完全不同的数字,从而创造一个完全不同的谜题,而不是如果我只会产生的微小差异改变了一个因素。
答案 0 :(得分:2)
让我们看看......一个相当天真的方法就是:为每个值分配必要的位数来保存它。也就是说,您有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
答案 1 :(得分:1)
您的号码大约为18位或大小为61-62位。这意味着它可以很好地适应单个DES块(8个字节或64位)。如果在ECB模式下对其进行加密,则会检索64位值,该值看起来像一个随机值。您可以将密钥保留在服务器上。单个8字节DES密钥应足以进行混淆,但您也可以使用16/24字节密钥进行DESede加密。
所以:当生成一个新的随机谜题时:创建你的数字,将其转换为长度为8字节的字节数组(如果你的数字太大则为N * 8字节)然后用一个密钥保持加密服务器(8,16或24个随机生成的字节)和一些备份。结果将再次为8个字节,您可以将其转换为大约20个数字。如果用户提供以前生成的号码,您可以使用服务器上的密钥对其进行解密,将生成的字节恢复为用于创建拼图的号码。
请注意,如果用户只输入一些随机数,它仍会解密,因此您可能需要检查结果数字的有效性(例如,测试一个数字是否确实为0..3而不是其他数字)。
答案 2 :(得分:0)
解决此问题的另一种方法是在内部保存谜题并将谜题绑定到唯一ID。