Generate Some Secure PINs

17

Inspired by this badly received migrated post.

The head of security at your company is concerned about your PIN generating system after it gave him 12345. He also didn't really appreciate the Spaceballs joke you made at his expense, so you've been delegated to re-write the PIN generator. Since it has to fit on some special hardware, you have to make it as small as possible.

Your Task

  • You take two inputs - # of PINs, and PIN size in digits.
  • Generate the specified number of PINs of the specified size randomly and print it out.
  • All valid PIN's of the size must be possible to be printed out, even if they aren't uniformly probable.
  • However, there are some restrictions on the PINs - here are the invalid ones:

    1. If all the pairs are the same digit: 114422 (Note: this will obviously include all same digit PINs).
    2. Increasingly linear PINs (mod 10): 246802.
    3. All groups of 3 are physical lines on the keypad of 1 2 3;4 5 6;7 8 9;bksp 0 enter;: 147369.
    4. The PIN can be entirely split up into groups from rule 1 and rule 3.


  • This is , so shortest code in bytes wins!

Maltysen

Posted 2015-10-12T18:27:09.187

Reputation: 25 023

Does rule one also include a single double pair (like 55123)? – mınxomaτ – 2015-10-12T18:40:18.113

@minxomat good point, ammending the rules to include both groups. That one will since the second half is 123, but 55432 would be fine. – Maltysen – 2015-10-12T18:42:36.407

Does rule 3 include diagonals? – Martin Ender – 2015-10-12T20:57:25.470

6The irony is that this definition of a so called "secure" pin only reduces the number of pins attackers might have to brute force! – DankMemes – 2015-10-13T01:36:59.007

@MartinBüttner no. – Maltysen – 2015-10-13T01:52:19.580

1What's the shortest length for rule 2? – Dennis – 2015-10-13T03:44:00.637

Answers

1

Pyth, 120 bytes

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

Figured I should add a real implementation then. Generates random numbers until one is found that meets all requirements. Can probably be improved a lot!

Online version

user46060

Posted 2015-10-12T18:27:09.187

Reputation:

1I have changed the rules to include the requirement that PINs must be random, and all PINs must be possible. – Maltysen – 2015-10-12T20:42:39.543

I thought you might :) – None – 2015-10-12T20:50:51.900

0

Perl 5, 244

Starts with generating random numbers for the given size.
And only prints those that don't meet the restrictions.

Finding a solution for the keypad lines (without hardcoding combinations) was kinda fun.

($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$_.$/}}

Test

$ perl gen_pins.pl 10 5
98121
15931
69042
93730
83458
25312
24601
49468
49490
67012

LukStorms

Posted 2015-10-12T18:27:09.187

Reputation: 1 776