Générer des codes PIN sécurisés

17

Inspiré par ce post migré mal reçu .

Le responsable de la sécurité de votre entreprise s'inquiète de votre système de génération de code PIN après sa remise 12345. Il n'a pas non plus vraiment apprécié la blague Spaceballs que vous avez faite à ses dépens, vous avez donc été délégué pour réécrire le générateur de code PIN. Puisqu'il doit tenir sur du matériel spécial, vous devez le rendre aussi petit que possible.

Ta tâche

  • Vous prenez deux entrées: le nombre de PIN et la taille du PIN en chiffres.
  • Générez au hasard le nombre spécifié de codes PIN de la taille spécifiée et imprimez-le.
  • Tous les codes PIN valides de la taille doivent pouvoir être imprimés, même s'ils ne sont pas uniformément probables.
  • Cependant, il existe certaines restrictions sur les codes confidentiels - voici les non valides:

    1. Si toutes les paires ont le même chiffre: 114422(Remarque: cela inclura évidemment tous les mêmes chiffres PIN).
    2. De plus en plus PINs linéaires (mod 10): 246802.
    3. Tous les groupes de 3 sont des lignes physiques sur le clavier 1 2 3;4 5 6;7 8 9;bksp 0 enter;: 147369.
    4. Le code PIN peut être entièrement divisé en groupes de la règle 1 et de la règle 3.


  • C'est le , donc le code le plus court en octets gagne!
Maltysen
la source
La règle 1 inclut-elle également une paire double simple (comme 55123)?
mınxomaτ
@minxomat bon point, modifiant les règles pour inclure les deux groupes. Celui-là le sera depuis la seconde moitié 123, mais ce 55432serait bien.
Maltysen du
La règle 3 inclut-elle les diagonales?
Martin Ender
6
L'ironie est que cette définition d'une broche dite "sécurisée" ne fait que réduire le nombre de broches que les attaquants pourraient avoir à utiliser par force brute!
DankMemes
1
Quelle est la longueur la plus courte pour la règle 2?
Dennis

Réponses:

1

Pyth, 120 octets

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

Je pensais que je devrais alors ajouter une véritable implémentation. Génère des nombres aléatoires jusqu'à ce qu'il en trouve un qui réponde à toutes les exigences. Peut probablement être beaucoup amélioré!

Version en ligne


la source
1
J'ai modifié les règles pour inclure l'exigence selon laquelle les NIP doivent être aléatoires et tous les NIP doivent être possibles.
Maltysen du
Je pensais que vous pourriez :)
0

Perl 5, 244

Commence par générer des nombres aléatoires pour la taille donnée.
Et n'imprime que ceux qui ne respectent pas les restrictions.

Trouver une solution pour les lignes du clavier (sans combinaisons de codage en dur) était plutôt amusant.

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

Tester

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