Google

quarta-feira, 7 de maio de 2014

Algoritmo para calcular a força da senha

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

Nenhum comentário:

Postagens populares