Ho creato questa semplice app, la versione Android del tool Alicekeygen. Esattamente come la versione desktop questa applicazione permette il recupero immediato della password wifi per le reti del tipo Alice-xxxxxxxx. I router supportati sono quelli della famiglia con firmware AGPF.
L'applicazione è stata realizzata con AndroidStudio, l'IDE ufficiale Google per lo sviluppo su piattaforma Android. L'algoritmo del tool originale è scritto in C, il porting in Java ha prodotto un algoritmo identico per funzionalità anche se differente nella forma (in Java mancano i puntatori, regole di casting diverse, etc..etc..).
Il tool originale era una semplice applicazione da riga di comando: per recuperare la password occorreva specificare l'SSID della rete, il MAC address della rete stessa e il file dei magic number. Utilizzare questa app è invece molto più semplice e intuitivo: le reti rilevate vengono semplicemente elencate nella schermata principale.
Le reti del tipo "Alice-xxxxxxxx" vengono colorate di rosso ad indicare che sono quelle supportate dall'applicazione. Selezionando una di esse verrà aperta la schermata delle password candidate da provare per quella rete:
Per provare una password è sufficiente copiarla nella clipboard (cliccandoci sopra) ed aprire le impostazioni di rete per effettuare l'accesso.
L'app è gratuita e disponibile in Google Play
Questo il porting Java dell'algoritmo originale:
String seriesXserial = "" + String.format("%05d", series) + "X" + String.format("%07d", serialsSet[j]);
/* calcola l'hash SHA256(fixedPadding + serie-X-seriale + MAC) */
try
{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(fixedPadding, 0, fixedPadding.length);
digest.update(seriesXserial.getBytes(), 0, seriesXserial.getBytes().length);
digest.update(macAddr, 0, macAddr.length);
byte[] hash = digest.digest();
char[] wpa = new char[24];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 24; i++)
{
int s = hash[i] & 0xFF;
wpa[i] = charset[s];
sb.append(wpa[i]);
}
if (passwordList.contains(sb.toString()) == false)
{
passwordList.add(sb.toString());
}
}
catch(Exception e)
{
return false;
}