Genera alcuni PIN sicuri


17

Ispirato da questo post migrato mal ricevuto .

Il responsabile della sicurezza della tua azienda è preoccupato per il tuo sistema di generazione del PIN dopo che gli è stato dato 12345. Inoltre non ha davvero apprezzato la battuta di Spaceballs che hai fatto a sue spese, quindi sei stato delegato a riscrivere il generatore di PIN. Dal momento che deve adattarsi a un hardware speciale, è necessario renderlo il più piccolo possibile.

Il tuo compito

  • Si accettano due input: il numero di PIN e la dimensione del PIN in cifre.
  • Generare il numero specificato di PIN della dimensione specificata in modo casuale e stamparlo.
  • È possibile stampare tutti i PIN validi delle dimensioni, anche se non sono uniformemente probabili.
  • Tuttavia, ci sono alcune restrizioni sui PIN: ecco quelli non validi:

    1. Se tutte le coppie hanno la stessa cifra: 114422(Nota: questo includerà ovviamente tutti i PIN della stessa cifra).
    2. PIN Sempre più lineari (mod 10): 246802.
    3. Tutti i gruppi di 3 sono linee fisiche sulla tastiera di 1 2 3;4 5 6;7 8 9;bksp 0 enter;: 147369.
    4. Il PIN può essere completamente suddiviso in gruppi dalla regola 1 e dalla regola 3.


  • Questo è , quindi vince il codice più breve in byte !

La regola 1 include anche una singola doppia coppia (come 55123)?
mınxomaτ,

@minxomat buon punto, ammendendo le regole per includere entrambi i gruppi. Quello sarà dalla seconda metà 123, ma 55432andrebbe bene.
Maltysen,

La regola 3 include le diagonali?
Martin Ender,

6
L'ironia è che questa definizione di un cosiddetto pin "sicuro" riduce solo il numero di pin che gli attaccanti potrebbero avere forza bruta!
DankMemes,

1
Qual è la lunghezza più breve per la regola 2?
Dennis,

Risposte:


1

Pyth, 120 byte

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

Ho pensato che avrei dovuto aggiungere una vera implementazione allora. Genera numeri casuali fino a quando non ne viene trovato uno che soddisfi tutti i requisiti. Probabilmente può essere migliorato molto!

Versione online


1
Ho modificato le regole per includere il requisito secondo cui i PIN devono essere casuali e tutti i PIN devono essere possibili.
Maltysen,

Ho pensato che potresti :)

0

Perl 5, 244

Inizia con la generazione di numeri casuali per la dimensione specificata.
E stampa solo quelli che non soddisfano le restrizioni.

Trovare una soluzione per le linee della tastiera (senza combinazioni di hardcoding) è stato abbastanza divertente.

($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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.