生成一系列随机6位数字,避免通过一个或换位错误的潜在



我有一个应用程序,其中将分配6个数字编号以实现物理访问控制。我遇到的困难是找到一种避免单位数字或换位误差的方法,从而导致有效的PIN(来自该位置的一系列引脚)。我们将在每个位置不需要1000针。

没有能力在访问控制点上执行校验和,因为它只会在批准的引脚列表中查找PIN。

有人有任何建议吗?

1000个数字很少。只需使用一个算法,该算法一次生成六位数的随机数。对于生成的每个数字,它检查该数字是否已经被摄取,如果没有,则将其添加到引脚列表中,并标记数字本身及其所有单个数字和换位错误。对于6位十进制数字,可以有6×9 = 54单位数字错误,而6C2 = 15换位错误(或仅在关心相邻的转座时,只有5个),因此数字本身以及附近的所有数字总计每个次数为每次70个数字,生成的数字,或您需要跟踪的70,000个数字。

这种方法的巨大好处,除了非常简单之外,它几乎完全随机地保持了6位数字的完整熵。任何单个引脚都没有额外的限制,只有在总共销钉上。因此,只有当您有很多已经知道的引脚时,理论上,您才能使用它们稍微减少尚不知道的销钉的搜索空间。我说,效果太少了,无法实现。即使您知道1000个引脚中的999个,也可以将最多999×70 = 69,930排除在10 6 = 1,000,000可能的引脚,即少于7%。

任何仅生成5位数字然后添加校验和的方法的熵将比这更小的熵,即,通过在该较小的域上通过蛮力试验找到PIN的秘诀。

评论提出了一个问题,这整个事情是否值得付出努力。一方面,碰撞的实际机会是什么?有(10 6 1000 = 10 6000 可能独立挑选引脚的方法(甚至允许重复)。大约有1,000,000×999,930×…=产品(10 6 −70 k f for 0至999)〜2.8×10 5984 在没有您描述的冲突的情况下这样做的方法。这是一个较小的数字。这些1000个数字中的任何两个(类似于生日悖论)之间发生任何冲突的机会是(10 6000 - 2.8×10 5984 )/10 6000 = = 1-2.8×10 -16 ≈1因此,使用完全随机选择的几乎发生冲突的可能是非常可能(尽管在数学中几乎不确定感觉)。这并不意味着任何单个引脚的任何单个错误都会有很大的机会与另一个PIN匹配。

另一方面,您要防止的情况是什么?任何任意号码的有效引脚的机会是1000:10 6 = 1:1000无论如何。因此,如果您考虑0.1%的可能性,那么一个陌生人就很可能猜出有效的别针。您要防止的是两件事之一。一个知道别人作为其他人身份验证的人。如果您考虑到普通用户输入和错误的设置中输入的销钉可能比陌生人随机输入的引脚更有可能。但是,除非PIN的身份相关,即,即根据PIN给予不同的访问权限,或者您保留使用了使用销钉的日志,这应该没关系:如果一个已经使用一个PIN销访问的人使用一个PIN访问不同的别针,那呢?在某种情况下,观察者可能正在观看针脚,因此可能会学习一个几乎正确的销钉,并且您希望避免出于偶然的偶然正确。如果这是一个严重的问题,则应考虑针对PIN板的设置,或者在输入PIN时要求用户隐藏其键盘。

最新更新