生成一些安全的PIN


17

受到这个深受好评的移民职位的启发。

您公司的安全负责人会担心您的PIN生成系统给您之后12345。他也不是很欣赏您为自己付出的代价而开玩笑的太空球笑话,因此您被委托重写PIN生成器。由于它必须适合某些特殊的硬件,因此您必须使其尽可能小。

你的任务

  • 您有两个输入-PIN数和PIN码的位数。
  • 随机生成指定数量的指定大小的PIN 并打印出来。
  • 即使不是统一概率,所有大小相同的有效PIN也必须能够打印出来。
  • 但是,PIN有一些限制-这是无效的:

    1. 如果所有对都是相同的数字:(114422注意:显然,这将包括所有相同的数字PIN)。
    2. 日益线性销(MOD 10): 246802
    3. 3所有群体的键盘上的物理线路1 2 3;4 5 6;7 8 9;bksp 0 enter;147369
    4. PIN可以从规则1和规则3完全分为几组。



规则一是否还包括一个双对(例如55123)?
mınxomaτ

@minxomat好点,将规则修改为包括两个组。从下半场开始,该值为123,但55432会很好。
Maltysen,2015年

规则3是否包括对角线?
马丁·恩德

6
具有讽刺意味的是,这种所谓的“安全”销的定义仅减少了攻击者可能不得不蛮力使用的销数量!
DankMemes

1
规则2的最短长度是多少?
丹尼斯

Answers:


1

Pyth,120个字节

Arz7VGJ1WJK%"%0*d",HO-^TH1=J|q1l{m%-F_vMcd1T.:K2u|GHmu|GHm?qlk2:k"(.)\\1"0?qlk3}k+++=bcS"123456789"3_Mb.Tb_M.TbZdZ./K0)K

想通了,我应该添加一个真实的实现。生成随机数,直到找到一个满足所有要求的数字。可能可以改善很多!

在线版


1
我更改了规则,以包括PIN必须随机且所有PIN必须都可以的要求。
马蒂森(Maltysen)2015年

我以为你可能会:)

0

Perl 5,244

从生成给定大小的随机数开始。
并且仅打印不符合限制的内容。

为键盘行找到解决方案(没有硬编码组合)有点有趣。

($k,$l)=@ARGV;$m=10**$l-1;while($n<$k){$_=sprintf("%0".$l."d",int(rand($m)));@N=split//,$_;pop@N;$i=$d=0;while(++$i<@N&&$d<1){$d=$N[$i-1]<=>$N[$i]}$b=$_;$b=~s|\d|@A=split//,$';2*$A[0]-$&-$A[1]==0|eg;if((!m/(\d)\1/)&$b>0&$d>=0){$n++;print$_.$/}}

测试

$ perl gen_pins.pl 10 5
98121
15931
69042
93730
83458
25312
24601
49468
49490
67012
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.