# Automated Password Generator

Automated Password Generator (APG) è uno standard per la generazione automatica di password casuali, pronunciabili o non pronunciabili.

## Introduzione

Deriva da una versione di un programma scritto in linguaggio C descritto in A Random Word Generator For Pronounceable Passwords del National Technical Information Service (NTIS). Il programma originale utilizzava funzioni del sistema Unix per produrre i numeri pseudo-casuali necessari al generatore di password. Queste funzioni sono state sostituite da una procedura che utilizza Data Encryption Standard (DES) in modalità ECB (Electronic code book). In input DES utilizza vecchie password oppure stringhe di caratteri fornite dall'utente, e una chiave pseudo-casuale creata secondo quanto stabilito dallo standard ANSI X9.17; qualsiasi cambiamento alla chiave o alle stringhe di dati in input fa sì che DES generi un numero random completamente diverso. Ogni volta che ciò accade, il generatore di password crea una password random differente.

## Generazione di password pronunciabili

Per quel che riguarda la generazione di password pronunciabili (ovvero parole non di senso compiuto, ma pronunciabili, dipendentemente dalla lingua di provenienza ovviamente), lo standard APG è organizzato con una procedura principale che fa riferimento a tre componenti importanti: (1) la unit table; (2) la digram table; (3) il sottoprogramma di numero casuale. Il generatore casuale di password funziona formando le sillabe pronunciabili e concatenandole per formare una parola. Le regole di pronunciabilità sono immagazzinate in una tabella per ogni unità ed ogni accoppiamento delle unità (digram). Le regole sono usate per determinare se una data unità sia legale o illegale, a seconda della relativa posizione all'interno della sillaba e delle unità adiacenti. La maggior parte delle regole e dei controlli sono orientati alle sillabe e non dipendono da qualcosa al di fuori della sillaba corrente. La procedura principale definisce le regole interne usate per generare le parole casuali. Il generatore di numeri casuali usa un sottoprogramma del DES per produrre i valori in virgola mobile di doppia precisione fra 0 e 1 (escluso). Questi numeri sono moltiplicati per una variabile n programmata che è un valore numerico intero. In questo modo si genera un numero intero casuale fra 0 e n-1 compreso. I numeri casuali generati dalla procedura DES servono come input al generatore casuale di parole. Il sottoprogramma per generare questi numeri è richiamato dal generatore di parole ogni volta che un carattere (unità) è necessario. Non tutti i caratteri generati saranno accettabili per il generatore di parole in ogni posizione della parola. Ogni carattere è controllato per vedere se vengono rispettate le regole definite dalle tabelle del digram e dell'unità. Di conseguenza il sottoprogramma del generatore di numeri casuali sarà richiamato ripetutamente fino a restituire un carattere accettabile. Esiste un limite superiore fissato a 100 chiamate; se si raggiunge tale limite, l'intera parola è scartata e il programma ricomincia. Come input il DES accetta due blocchi di dati di 64 bit. Uno consiste della vecchia password o di una stringa di dati; l'altra è una chiave pseudo-casuale di 64 bit (56 bit + 8 bit di parità) derivata seguendo la procedura descritta nell'ANSI X9.17. La vecchia password è digitata manualmente dalla tastiera. Un allineamento dell'input è generato dai primi otto byte della parola d'accesso o della stringa immessa. Il programma accetterà una stringa nulla (carriage return). Tutti i caratteri ulteriori sono ignorati. Se il blocco dell'input è minore di otto caratteri, gli elementi supplementari dell'input sono riempiti di zeri. L'ECB del DES è poi usato per cifrare i dati di input. L'output è un numero casuale di 64 bit che è la forma cifrata dell'input. La prima funzione nella struttura del DES è setkey, che converte la chiave pseudo-casuale in un formato usato da DES per la crittografia. Le opzioni della riga di comando trasmesse a setkey sono (0, 0, key). Il primo '0' è regolato in modo che il setkey non generi la parità; il secondo '0' dice a setkey che è richiesta crittografia (piuttosto che decrittografia); key è un puntatore all'inizio dell'array di chiavi. Dopo setkey, viene richiamata la funzione des, che per input usa gli indirizzi degli array di input e output, definiti entrambi come array di unsigned char di 8 byte di lunghezza. L'array di output è prodotto da una funzione answer, che restituisce il numero finale richiesto. La funzione answer prende l'indirizzo dell'array di output come puntatore ad unsigned char ed il numero intero n il cui valore compreso tra 0 e n-1 è necessario al programma di generazione di parole casuali. Questa funzione genera una somma variabile, definita come valore intero unsigned. Per ottenere un valore numerico dall'array di caratteri di output, aggiunge i valori ASCII dei primi tre elementi dell'array di output ed immagazzina la somma nella relativa variabile. Quindi
che è un numero intero. Per ottenere un numero entro il range richiesto, da 0 a n-1, dalla somma, la funzione prende il valore del modulo tra la somma e n, sum%n. Questo valore quindi è restituito alla funzione chiamante.

## Sicurezza delle applicazioni

Le password pronunciabili generate da questo generatore automatico si compongono dei 26 caratteri dell'alfabeto inglese:
* password di 6 caratteri: circa 18 milioni;
* password di 8 caratteri: circa 5,7 miliardi;
* password di 10 caratteri: circa 1600 miliardi.
Inserendo una password abbastanza lunga risulta praticamente impossibile riuscire a indovinarla. Utilizzando non solo le lettere dell'alfabeto, ma anche numeri e caratteri speciali, creando password non pronunciabili e quindi completamente random, ci si mette al sicuro da attacchi di tipo "dizionario".