Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Criptografia RC4 em C

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ Criptografia RC4 em C

    Ae galera trago pra vocês uma source de criptografia RC4 em C.
    Segue o código:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>


    //==================================================
    unsigned char chave[256];
    unsigned char entrada[256];
    unsigned char *resultado;
    unsigned char s[256];
    unsigned int i, j, tamanho_chave, tamanho_entrada;
    //==================================================
    void troca()
    {
    unsigned char aux;
    aux=s[i];
    s[i]=s[j];
    s[j]=aux;
    }

    //================================================== ==

    void ksa ()
    {
    for (i = 0; i < 256; i++)
    {
    s[i]=i;
    }
    j=0;
    for (i = 0; i < 256; i++)
    {
    j = (j + s[i] + chave[i % tamanho_chave]) % 256;
    troca(s, i, j);
    }
    i=0;
    j=0;
    }

    //================================================== ==

    void prga ()
    {
    unsigned int aux;
    unsigned char result[tamanho_entrada-1];
    for (aux=0; aux < tamanho_entrada; aux++)
    {
    i = (i + 1) % 256;
    j = (j + s[i]) % 256;
    troca(s,i,j);
    result[aux]=(s[(s[i] + s[j]) % 256])^entrada[aux];
    }
    resultado=(unsigned char*)malloc((tamanho_entrada-1)*(sizeof(unsigned char)));
    strcpy(resultado, result);
    }

    //================================================== ==


    int main ()
    {
    unsigned char confirma[256];
    int confirm;
    printf ("Escreva a Frase a ser Criptografada:");
    scanf ("%[^\n]", entrada);
    tamanho_entrada=strlen(entrada);
    fflush(stdin);
    printf ("\nChave:");
    scanf ("%[^\n]", chave);
    tamanho_chave=strlen(chave);
    system("pause");
    ksa ();
    prga ();
    printf ("\nResultado Gerado: %s\n", resultado);
    system("pause");
    fflush(stdin);
    printf ("\n\nPara Desfazer, confirme a chave: ");
    TENTA: scanf ("%[^\n]", confirma);
    confirm=strcmp(confirma, chave);
    if (confirm==0)
    {
    printf ("\nDesfazendo....\n");
    strcpy(entrada, resultado);
    ksa();
    prga ();
    printf ("\nFrase Original: %s\n", resultado);
    fflush(stdin);
    system("pause");
    }
    else
    {
    fflush(stdin);
    printf ("Chave nao confere, por favor insira a chave correta:\n");
    goto TENTA;
    }
    return 0;
    }
    Fonte: Wikipedia

  • Font Size
    #2
    Obrigado por compartilhar Franco, vou dar uma olhada nela com calma.

    Abraços.

    WCG147
    sigpic

    Comment


    • Font Size
      #3
      Obrigado por compartilhar cara! Você testou?

      Vou dar uma olhada no código também, vamos ver se dá para trabalhar nele e depois eu falo.

      Shalom!
      sigpic
      Eis que estou à porta, e bato; se alguém ouvir a minha voz, e abrir a porta,
      entrarei em sua casa, e com ele cearei, e ele comigo. (Apocalipse 3:20)

      https://twitter.com/jackads
      http://www.facebook.com/jackson.beneteferreira

      Comment


      • Font Size
        #4
        Irmão, fiz uns ajustes para funcionar no linux e o código ficou assim:

        Código:
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        
        
        //==================================================
        unsigned char chave[256];
        unsigned char entrada[256];
        unsigned char *resultado;
        unsigned char s[256];
        unsigned int i, j, tamanho_chave, tamanho_entrada;
        //==================================================
        void troca()
        {
        unsigned char aux;
        aux=s[i];
        s[i]=s[j];
        s[j]=aux;
        }
        
        //================================================== ==
        
        void ksa ()
        {
        for (i = 0; i < 256; i++)
        {
        s[i]=i;
        } 
        j=0;
        for (i = 0; i < 256; i++)
        {
        j = (j + s[i] + chave[i % tamanho_chave]) % 256;
        troca(s, i, j);
        }
        i=0;
        j=0;
        }
        
        //================================================== ==
        
        void prga ()
        { 
        unsigned int aux;
        unsigned char result[tamanho_entrada-1];
        for (aux=0; aux < tamanho_entrada; aux++)
        {
        i = (i + 1) % 256;
        j = (j + s[i]) % 256;
        troca(s,i,j);
        result[aux]=(s[(s[i] + s[j]) % 256])^entrada[aux];
        }
        resultado=(unsigned char*)malloc((tamanho_entrada-1)*(sizeof(unsigned char)));
        strcpy(resultado, result);
        }
        
        //================================================== ==
        
        
        int main ()
        {
        unsigned char confirma[256];
        int confirm;
        printf ("Escreva a Frase a ser Criptografada:");
        scanf ("%s", &entrada);
        tamanho_entrada=strlen(entrada);
        __fpurge(stdin);
        printf ("\nChave:");
        scanf ("%s", &chave);
        tamanho_chave=strlen(chave);
        //
        ksa ();
        prga ();
        printf ("\nResultado Gerado: %s\n", resultado);
        //
        __fpurge(stdin);
        printf ("\n\nPara Desfazer, confirme a chave: ");
        TENTA: 
        scanf ("%s", &confirma);
        confirm=strcmp(confirma, chave); 
        if (confirm==0)
        { 
        printf ("\nDesfazendo....\n");
        strcpy(entrada, resultado);
        ksa();
        prga ();
        printf ("\nFrase Original: %s\n", resultado);
        __fpurge(stdin);
        //
        }
        else
        {
        __fpurge(stdin);
        printf ("Chave nao confere, por favor insira a chave correta:\n");
        goto TENTA;
        }
        return 0;
        }

        Só que precisa de alguns ajustes ainda, por exemplo pelo menos aqui no linux se a frase tiver um espaço ele não criptografa depois do espaço e tudo se perde, por exemplo se eu criptografar "guiadohacker" vai aparecer a frase toda descriptografada, mas se eu criptografar "guia do hacker" só vai aparecer "guia" descriptografado, o resto da frase se perde... Mas eu não consegui achar ainda onde no código está o erro que causa isso.

        Mas de qualquer forma o programa é muito bom, é muito interessante ficar brincando com isso e dá para estudar bastante, vou ver se com o tempo e com mais estudo se consigo criar algum outro algoritmo de criptografia diferente e mais funcional, por enquanto vou estudando por esse...


        Shalom!
        sigpic
        Eis que estou à porta, e bato; se alguém ouvir a minha voz, e abrir a porta,
        entrarei em sua casa, e com ele cearei, e ele comigo. (Apocalipse 3:20)

        https://twitter.com/jackads
        http://www.facebook.com/jackson.beneteferreira

        Comment


        • Font Size
          #5
          Valeu boa.
          Só não posto os source em C porque infelizmente tenho que usar Ruwindows.
          E é chato ficar usando VM,e tbm tudo que aprendi de C foi em windows.
          Mais é só questão de tempo pra mim aprender as diferenças de linux em windows.
          Vou salvar o source aqui pro linux.

          Só que precisa de alguns ajustes ainda, por exemplo pelo menos aqui no linux se a frase tiver um espaço ele não criptografa depois do espaço e tudo se perde, por exemplo se eu criptografar "guiadohacker" vai aparecer a frase toda descriptografada, mas se eu criptografar "guia do hacker" só vai aparecer "guia" descriptografado, o resto da frase se perde... Mas eu não consegui achar ainda onde no código está o erro que causa isso.
          O problema nesse caso é que a variavel scanf ignora o espaço em branco e por isso colocando Guia do Hacker só vai aparecer Guia pq o scanf acha que o espaço é o termino da string por isso não aparece,tente usar a função gets(nome_da_string).Espero que dê certo.

          Abraços,

          #Franco

          Comment


          • Font Size
            #6
            Postado Originalmente por #Franco Ver Post
            Valeu boa.
            Só não posto os source em C porque infelizmente tenho que usar Ruwindows.
            E é chato ficar usando VM,e tbm tudo que aprendi de C foi em windows.
            Mais é só questão de tempo pra mim aprender as diferenças de linux em windows.
            Vou salvar o source aqui pro linux.


            O problema nesse caso é que a variavel scanf ignora o espaço em branco e por isso colocando Guia do Hacker só vai aparecer Guia pq o scanf acha que o espaço é o termino da string por isso não aparece,tente usar a função gets(nome_da_string).Espero que dê certo.

            Abraços,

            #Franco
            Você tem razão irmão o scanf ignora mesmo os espaços, mas em hipótese nenhuma utilize gets irmão, gets é o mestre do buffer overflow, tentei usar o fgets mas deu problema aqui e acabei chegando à conclusão de que o melhor é usar scanf mesmo com placeholder "%[^\n]s", há pouco tempo vi esse placeholder em um tópico aqui e até critiquei mas acabei de descobrir que é o melhor método de capturar espaços de string. Fuja do gets.

            Sobre a source em linux não tem problema, você tem que programar para o sistema operacional que você usa mesmo, as diferenças entre linux e windows estão em bibliotecas e você só vai aprender realmente quando começar a programar em linux e ver que vários comandos que você usava antes agora não funcionam mais... Mas isso é com o tempo e nem é tão absurdo assim, rapidinho você se adapta.

            Se você usa windows então continue programando para windows mesmo, se eu uso linux e quero usar uma source sua de windows cabe a mim o trabalho de portá-la. Se um dia você começar a usar linux rapidinho você se adapta.

            Shalom!
            sigpic
            Eis que estou à porta, e bato; se alguém ouvir a minha voz, e abrir a porta,
            entrarei em sua casa, e com ele cearei, e ele comigo. (Apocalipse 3:20)

            https://twitter.com/jackads
            http://www.facebook.com/jackson.beneteferreira

            Comment


            • Font Size
              #7
              Muito bom ! Parabens

              FalcoOmxD


              "stay hungry stay foolish" - Um perfeito círculo virtuoso, talvez utópico, mas alcançável.
              Steve Jobs

              Comment

              X
              Working...
              X