Math 生成一系列随机的6位数字,以避免因一位或换位错误而导致的潜在错误

Math 生成一系列随机的6位数字,以避免因一位或换位错误而导致的潜在错误,math,random,checksum,Math,Random,Checksum,我有一个应用程序,其中6位数字将被分配用于物理访问控制。我遇到的困难是找到一种方法来避免导致有效引脚(从该位置的引脚序列)的单位数或换位错误。我们希望每个位置不需要超过1000个引脚 无法在访问控制点执行校验和,因为它只需根据已批准的PIN列表查找PIN 有人有什么建议吗?1000个数字很少。只要有一个一次生成一个六位数随机数的算法。对于生成的每个数字,它会检查该数字是否已被取下,如果没有,则将其添加到管脚列表中,并将数字本身及其所有单个数字和转置错误标记为已取下。对于6位十进制数字,可能会有6

我有一个应用程序,其中6位数字将被分配用于物理访问控制。我遇到的困难是找到一种方法来避免导致有效引脚(从该位置的引脚序列)的单位数或换位错误。我们希望每个位置不需要超过1000个引脚

无法在访问控制点执行校验和,因为它只需根据已批准的PIN列表查找PIN


有人有什么建议吗?

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

这种方法的最大好处是,除了非常简单外,它几乎保持了完全随机生成6位数的全熵。对任何一个管脚都没有额外的限制,只对管脚的总数有限制。因此,只有当你有相当数量的已知PIN码时,理论上你才可以使用它们来略微减少未知PIN码的搜索空间。我想说,这种影响太小,没有实际意义。即使您知道1000个管脚中有999个,也可以排除106=1000000个可能管脚中的999×70=69930个,即小于7%

任何只生成5位数字然后添加校验和的方法的熵都会小于此值,也就是说,在较小的域上通过蛮力试验更容易找到PIN

一篇评论提出了这样一个问题:这整件事是否值得付出努力。一方面,发生碰撞的实际可能性是多少?有(106)1000=106000种可能的方法可以独立拾取引脚(甚至允许重复)。大约有1000000×999930×…=产品(106−从0到999的k为70k)≈2.8×105984在没有您描述的冲突的情况下执行此操作的方法。这个数字要小得多。这1000个数字中的任何两个(类似于)发生冲突的可能性为(106000)− 2.8×105984)/106000 = 1−2.8×10−16≈ 1因此,使用完全随机的选择,这种几乎是冲突的情况很可能发生(虽然不是数学意义上的)。不过,这并不意味着这些管脚中任何一个管脚的任何一个错误都有很大机会匹配另一个管脚


另一方面,你在防范什么样的情况?任何任意数字成为有效PIN的几率都是1000:106=1:1000。所以,如果你认为0.1%是可能的话,陌生人很可能猜到一个有效的PIN。你要防范的是两件事之一。知道PIN认证为其他人的人。如果您考虑到普通用户输入的PIN和在某些设置中输入错误的PIN可能比陌生人随机输入的PIN更有可能,这是有道理的。但是,除非PIN的身份是相关的,即您根据PIN授予不同的访问权限,或者您记录使用了哪些PIN,否则这并不重要:如果已经使用一个PIN访问权限的人使用不同的PIN获得访问权限,那又怎样?还有一种情况是,观察者可能正在观察引脚垫,因此可能学习到一个几乎正确的引脚,而您希望避免它因意外而实际正确。如果这是一个严重的问题,你应该考虑PIN Pad的设置,或者要求用户在输入PIN时隐藏他们的键盘。< /P>生成5位数字并使用一个校验和数字。Verhoeff算法从5个数字中建立一个PIN,然后在第六个上加校验和也会很好。我真的很喜欢这个答案。我想知道,对于这么多的引脚,避免抄写和单个数字错误是否值得。在没有过滤的情况下,使用其中一个纯随机管脚获得幸运的概率可能与仅猜测1000个唯一管脚中的一个相同。我喜欢扩展部分。我的想法是:如果我的PIN码是123456,那么就有10^6-1=999999个其他可能的PIN码,999个其他实际PIN码,以及大约70个其他PIN码可以从单个数字或单个转录错误中获得(忽略重复转录)。如果事情分布均匀,我预计另一个潜在PIN成为另一个实际PIN并通过错误/转录获得的几率约为999/999999 x 70/999999,远低于1/1000。你计算它可能发生的概率;我计算它实际随机发生的概率。