Ho creato una risposta usando Javascript, perché è ciò a cui sono abituato e non viene specificata alcuna lingua. Sono fiducioso che tu possa trovare / creare un analogo in qualunque altra lingua tu voglia.
Innanzitutto, ho rubato una funzione da questa risposta per creare un prodotto cartesiano. La spiegazione dei prodotti cartesiani non rientra proprio nello scopo di questa domanda, ma è sufficiente dire che combina array di possibili caratteri in matrici di stringhe possibili (molto semplificate).
OK, quindi la funzione di ckozl è:
function cartProd(paramArray) {
function addTo(curr, args) {
var i, copy,
rest = args.slice(1),
last = !rest.length,
result = [];
for (i = 0; i < args[0].length; i++) {
copy = curr.slice();
copy.push(args[0][i]);
if (last) {
result.push(copy);
} else {
result = result.concat(addTo(copy, rest));
}
}
return result;
}
return addTo([], Array.prototype.slice.call(paramArray));
}
e il mio è:
function findSubs(string) {
//create a linked list of sub characters
//expect lower case input
subs={
"p":["p","P"],
"a":["a","A","4","@"],
"s":["s","S","$","5"]
}
//create an (initially empty) array to store possible characters in each position
result=[]
for (var i=0;i<string.length;i++) {
result[i]=subs[string.charAt(i)]; //Would be more robust if you added logic here to handle it not being a key in the subs object.
}
/*
so result might look like:
[
["p","P"],
["a","A","4","@"],
["s","S","$","5"],
["s","S","$","5"]
]
for an input of "pass"
*/
return cartProd(result)
}
Onestamente, la funzione di ckzol fa tutto il lavoro pesante qui. Prima di usarlo dovresti inserire l'array subs e questo non gestisce l'aggiunta di caratteri alla fine della stringa (perché sembra un po 'arbitrario).
Nota anche che ho modificato leggermente la funzione cartProd, in modo tale che possiamo distribuirla come array di parametri anziché come array multipli che sovraccaricano gli argomenti.
Modifica: notate anche che il valore restituito è una matrice di matrici, quindi dovreste scorrere iterarlo e per ogni elemento e
do e.join("")
.
Modifica di nuovo: si noti inoltre che è possibile estenderlo facilmente per applicare altre mutazioni alla password. Ad esempio, se si desidera aggiungere un numero compreso tra 0 e 99 alla fine della stringa, è possibile inserire una matrice aggiuntiva alla fine del risultato, contenente ["0","1","2",...,"99"]
. È possibile includere un elemento vuoto ( ""
) in questo array per generare anche possibilità che non includono il suffisso numerico. La stessa logica potrebbe essere utilizzata per aggiungere un prefisso. Essenzialmente stai costruendo una serie di matrici di possibili caratteri nell'array dei risultati, quindi puoi includere qualsiasi mutazione a cui puoi pensare.