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;
}


