Ir para conteúdo
Fabiano Furtado

Keygen genérico

Posts Recomendados

Pessoal,

tudo bem? Estou estudando esse universo chamado C e desenvolvi uma aplicação simples que é um gerador genérico de chaves para um aplicativo qualquer. Ele soma os valores ASCII do array de caracteres gerado aleatoriamente e gera a chave baseado nesta soma. Bem simples.

Gostaria de opiniões, críticas e sugestões.

Link: https://github.com/fabianofurtado/my_keygen

Agradeço desde já.

Editado por Fabiano Furtado
  • Curtir 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bacana, porém tive que mudar a linha 35.
 

const unsigned char valid_chars[73] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_@$%^*#?!";

de 73 para 74 pois estava dando erro.
A propósito, você está aprendendo a programar por onde? Ainda não cheguei nesse nível e quero me aperfeiçoar.
Tem algum livro que está lendo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala, Fabiano!
Muito legal o seu programa.
Só tive uma dúvida. Quando você cria a função "sum_ascii()", você define a variável "i", que está dentro do laço for, como "unsigned char" e, em seguida, atribui um valor inteiro a ela (valor 0).  O correto não seria "unsigned int i" ou mesmo "int  i", já que a variável recebe um valor inteiro? Eu mudei o código e o programa rodou de forma normal, ou seja, tanto "unsigned char" quanto "unsigned int" funcionam. Só queria saber se existe um motivo para usar o "unsigned char" neste caso?
Grande abraço!


 

path18.png

 

Editado por BrNaka

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
int main(){
    printf("sizeof(unsigned char): %d\n", sizeof(unsigned char));
    printf("sizeof(unsigned int): %d\n", sizeof(unsigned int));
    return 0;
}

 

$ gcc main.c && ./a.exe
sizeof(unsigned char): 1
sizeof(unsigned int): 4

Para guardar caracteres ASCII 1 byte é o suficiente. Se fosse unicode (até mesmo UTF-8), ai teria que reservar pelo menos 2 bytes (se quiser por exemplo, caracteres com acento, etc.).

Obs.: já vi na internet que o int varia conforme a arquitetura que a gente compila como alvo (target).

Editado por gzn
  • Agradecer 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Fabiano Furtado você ta aprendendo bem C, parabéns hehe

Próximo passo :D

Utilizar alocação dinâmica (malloc, calloc, etc.) para um tamanho arbitrário de chave. Também seria uma boa fazer das duas diretivas:

#define key_size   10  // size of the key in characters
#define key_sum   914  // arbitrary number: sum of ASCII characters for key validation

serem parâmetros na linha de comando (pode ser pelo argv ou você lê com fgets, scanf, etc.).

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 08/01/2018 em 22:39, Fabiano Furtado disse:

Pessoal,

tudo bem? Estou estudando esse universo chamado C e desenvolvi uma aplicação simples que é um gerador genérico de chaves para um aplicativo qualquer. Ele soma os valores ASCII do array de caracteres gerado aleatoriamente e gera a chave baseado nesta soma. Bem simples.

Gostaria de opiniões, críticas e sugestões.

Link: https://github.com/fabianofurtado/my_keygen

Agradeço desde já.

Opa, @Fabiano Furtado. Bele ?

Única coisa que eu acrescento é que desde C99 que é possível declarar variáveis dentro de um loop, por exemplo (for(int i =0...)). Tudo bem que seu código é pequeno, mas você não acharia melhor declarar dentro do escopo em que ela é utilizada ? Veja as duas variáveis vd e ks. Tudo bem que o otimizador do GCC "entende" e melhora o código, mas é bom ter em mente e tentar isolar as variáveis dentro dos seus respectivos escopos e evitar declarar tudo "global". Só uma dica mesmo. Bacana o keygen :). Abraço!

 

Em 13/01/2018 em 21:38, BrNaka disse:

Fala, Fabiano!
Muito legal o seu programa.
Só tive uma dúvida. Quando você cria a função "sum_ascii()", você define a variável "i", que está dentro do laço for, como "unsigned char" e, em seguida, atribui um valor inteiro a ela (valor 0).  O correto não seria "unsigned int i" ou mesmo "int  i", já que a variável recebe um valor inteiro? Eu mudei o código e o programa rodou de forma normal, ou seja, tanto "unsigned char" quanto "unsigned int" funcionam. Só queria saber se existe um motivo para usar o "unsigned char" neste caso?
Grande abraço!


 

path18.png

 

Eai, @BrNaka.
Eu não vi nada em específico também. Em C devemos olhar mais para os tamanho de cada tipo do que para o conteúdo. Int não quer dizer que o que vai contar lá é um inteiro. Int é mais uma questão de tamanho (4 bytes). Char (1 Byte). Como o tamanho da key é 10, tanto faz ser unsigned char ou simplesmente char. Em char (1 byte) signed cabe de -128 <-> 128 ou 255. Em um unsigned é a mesma coisa, o GCC aceita do mesmo jeito, contudo se você tentar colocar um número negativo aqui ele vai ignorar o sinal e irá mostrar o número positivo. Ele quis usar char para diminuir a alocação de espaço em memória, acredito eu. 

Abraço!

Editado por Pimptech
  • Agradecer 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 1/13/2018 em 21:38, BrNaka disse:

Fala, Fabiano!
Muito legal o seu programa.
Só tive uma dúvida. Quando você cria a função "sum_ascii()", você define a variável "i", que está dentro do laço for, como "unsigned char" e, em seguida, atribui um valor inteiro a ela (valor 0).  O correto não seria "unsigned int i" ou mesmo "int  i", já que a variável recebe um valor inteiro? Eu mudei o código e o programa rodou de forma normal, ou seja, tanto "unsigned char" quanto "unsigned int" funcionam. Só queria saber se existe um motivo para usar o "unsigned char" neste caso?
Grande abraço!

path18.png

 

Existe um problema em usar tipos menores que 'int', neste caso. Seu processador, por default, tenta lidar com tamanhos do tipo 'int' (dwords ou 32 bits). Usar 'char' ou 'short' implica em usar varáveis menores, mas o código tende a ficar maior, porque toda referência a arrays e ponteiros depende de manipulações de "endereços" e, esses, têm 32 ou 64 bites, dependendo da arquitetura.

NESTE caso específico, com as otimizações ligadas, não faz muita diferença porque o loop tem número definido de iterações (10)... De qualquer maneira, é preferível usar como contadores o tipo 'int' ou o derivado não sinalizado.

PS: Mesmo no modo x86-64 o tipo 'int' é preferível. Embora neste modo os endereços tenham 48 bits de tamanho e os registradores, 64, as instruções com menores opcodes continuam sendo aquelas que manipulam os GPRs (General Purpose Registers) de 32 bits.

PS2: Se for o caso de não querer se preocupar com o tamanho e sempre usar um tamanho suficientemente grande para caber contagens usadas para endereçar arrays e bufffers, prefira usar size_t (definida em stddef.h e incluída em stdlib.h e stdio.h, bem como em outros headers da libc)...

  • Agradecer 2
  • l33t 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

É apenas um hint. O compilador tenta, sempre que possível, manter variáveis locais automáticas em registradores (especialmente com otimizações ligadas).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora


  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×