Especificação do algoritmo
N = tamanho da senha;
C = cardinalidade inicialmente com valor zero e conforme as regras abaixo soma-se os valores para a cardinalidade (C);
Se possuir letras minuscula então soma 26 a C;
Se possuir letras MAIUSCULAS então soma mais 26 a C;
Se possuir numeros então soma mais 10 a C;
Se possuir símbolos então soma mais 73 a C; Cardinalidade mínima = 10; Cardinalidade máxima = 135;
E = N * log2(C)(Entropia)
Entropia mínima. E = 8 * log2(10) = 8 * 3.32 = 26,56
Entropia máxima. E = 20 * log2(135) = 20 * 7.07 = 141,40
Aplicamos a regra de 3 com sendo o máximo 141,40 para notas de 0 a 10 para o resultado da força.
#define _GNU_SOURCE #include <stdio.h> #include <math.h> #include <ctype.h> #include <string.h> //gcc -o forca_senha -lm forca_senha.c int main(int argc, char *argv[]){ int n = 0; //tamanho da senha int c = 0; //cardinalidade float e = 0.0; //entropia int i = 0; char *senha = NULL; if(!argv[1]){ printf("Argumento não informado!!\n\n"); return -1; } senha = argv[1]; printf("Calcular Forca da senha[%s]..\n\n",argv[1]); n = strlen(senha); printf("%s:[%s.%d] - Tamanho da senha[%d].\n", __FILE__,__FUNCTION__,__LINE__,n); for(i = 0; *(senha+i) != '\0' ; i++){ if(isupper(senha[i])){ printf("%s:[%s.%d] - Possui letra Maiuscula. %c\n", __FILE__,__FUNCTION__,__LINE__,senha[i]); c = 26; break; } } for(i = 0; *(senha+i) != '\0' ; i++){ if(islower(senha[i])){ printf("%s:[%s.%d] - Possui letra Minuscula. %c\n", __FILE__,__FUNCTION__,__LINE__,senha[i]); c = c + 26; break; } } for(i = 0; *(senha+i) != '\0' ; i++){ if(isdigit(senha[i])){ printf("%s:[%s.%d] - Possui numeros. %c\n", __FILE__,__FUNCTION__,__LINE__,senha[i]); c = c + 10; break; } } for(i = 0; *(senha+i) != '\0' ; i++){ if(ispunct(senha[i])){ printf("%s:[%s.%d] - Possui caracteres especiais. %c\n", __FILE__,__FUNCTION__,__LINE__,senha[i]); c = c + 73; break; } } char aux[50]; e = n * log2(c); e = (e*10) / 141.40; snprintf(aux,sizeof(aux),"%.0f",e); printf("%s:[%s.%d] - Cardinalidade[%d].\n", __FILE__,__FUNCTION__,__LINE__,c); printf("%s:[%s.%d] - Forca da senha[%s].\n", __FILE__,__FUNCTION__,__LINE__,aux); printf("%s:[%s.%d] - Fim Calcular Forca Senha.\n", __FILE__,__FUNCTION__,__LINE__); return 0; }