Resultados 1 a 8 de 8

Tópico: Cifra de Vigenère

  1. #1
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like

    Cifra de Vigenère

    Vendo o tópico do mmxm sobre a Cifra de Vigenère, resolvi fazer em Perl.

    Código PHP:
    #!usr/bin/env perl
    use warnings;
    use 
    strict;
    use 
    feature 'say';
    sub toupper{    
        
    my $w shift;
        
    $w chr $w;
        
    $w =~ tr/[a-z]/[A-Z]/;
        
    $w ord $w;
        return 
    $w;
    }
    sub isalpha{
        
    my $char shift;
        
    $char chr $char;
        return 
    if ($char =~ /[a-zA-Z]/) or return 0;
    }
    sub strtochar{
            
    my $c shift;
            
    my @split (//, $c);
        
    for (my $i 0$i < @b$i++){
            
    $b[$i] = ord $b[$i];
        }    
    return @
    b;
    }
    sub encode{
        
    my @word strtochar($_[0]);
        
    my @key strtochar($_[1]);
            
    my ($a$tword);
            for (
    $a 0$a < @word$a++){
            if(
    isalpha($word[$a]), isalpha($key[$a])){
                                
    $word[$a] = toupper($word[$a]) - 65;
                
    $key[$a] = toupper($key[$a]);
                            
    my $cript $key[$a] + $word[$a]; 
                if (
    $cript >= 91){
                    
    $cript -= 26;
                }
                            
    $word[$a] = $cript;
                 
    $tword .= chr $word[$a];
            }
        }
        return 
    $tword;
                }
    sub decode{
        
    my @word strtochar($_[0]);
        
    my @key strtochar($_[1]);
            
    my ($a$tword);
            for (
    $a 0$a < @word$a++){
            if(
    isalpha($word[$a]), isalpha($key[$a])){
                                
    $word[$a] = toupper($word[$a]);
                
    $key[$a] = toupper($key[$a]);
                            
    my $cript =  $word[$a] - $key[$a] +65
                if (
    $cript <= 64){
                    
    $cript += 26;
                }
                            
    $word[$a] = $cript;
                 
    $tword .= chr $word[$a];
            }
        }
        return 
    $tword;
    }
    sub help{
         print 
    "\n[+] Cifra de Vigenere\n";
         print 
    "[0] Coder => guedes.acp\n\t\treleitura de MMxM";
         print 
    "\n\tModo de uso: $0 <palavra> <chave> <e|d>\n";
         print 
    "\n\t \"A chave e a palavra devem ter o mesmo tamanho\"\n\n";
         exit(
    0);
     }
    sub main{
        
    my $cmd;
        if(@
    ARGV != 3){
             
    help;
         }
              if(
    length($ARGV[0]) != length($ARGV[1])){
             
    help;
         }
        {
            if (
    $ARGV[2eq 'd'){
                 
    $cmd decode($ARGV[0], $ARGV[1]);
             }
            
    elsif ($ARGV[2eq 'e'){
                
    $cmd encode($ARGV[0], $ARGV[1]);
            }
            else {
                
    help;
            }
        }

        print 
    "PALAVRA: " $ARGV[0] . "\n";
         print 
    "CHAVE: " $ARGV[1] . "\n";
         print 
    "RESULTADO: " $cmd "\n\n";
     }
    main
    PasteBin
    Última edição por guedes.acp; 10 Nov 2013 às 00:37.
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  2. #2
    Moderador ingresso Avatar de .Nero
    Data de Ingresso
    Feb 2012
    Localização
    Earth
    Posts
    699
    Post Thanks / Like
    Só pra entrar na brincadeira, pode não ser o menor código, nem o mais bonito, mas funciona:

    Código:
    class ExcLength extends Exception {
        public String toString() {
            return "\n[ERRO] Texto e chave devem conter o mesmo tamanho\n";
        }
    }
    
    
    class ExcNumber extends Exception {
        public String toString() {
            return "\n[ERRO] Texto e chave nao podem conter numeros\n";
        }
    }
    
    
    class ExcCommand extends Exception {
        public String toString() {
            return "\n[ERRO] Comando invalido\n";
        }
    }
    
    
    public class Vigenere {
    
    
        static String txt = "";
        static String key = "";
        static String result = "";
    
    
        static void exec(String[] args) throws ExcCommand, ExcLength, ExcNumber {
    
    
            txt = args[1].toUpperCase();
            key = args[2].toUpperCase();
    
    
            if (txt.matches(".*[0-9].*") || key.matches(".*[0-9].*"))
                throw new ExcNumber();
    
    
            if (txt.length() != key.length())
                throw new ExcLength(); 
    
    
            if (args[0].equals("-e")) {
                encrypt(args);
            } else if (args[0].equals("-d")) {
                decrypt(args);
            } else {
                throw new ExcCommand();
            }
        }
    
    
        static void encrypt(String[] args) {
            for (int i = 0; i < txt.length(); i++) {
                int aux1 = txt.codePointAt(i) - 65;
                int aux2 = key.codePointAt(i) - 65;
                
                aux1 = (aux1 + aux2) % 26 + 65;
                result = result.concat(Character.toString((char)aux1));
            }
    
    
            System.out.println("\n[RESULTADO] " + result + "\n");
        }
    
    
        static void decrypt(String[] args) {
            for (int i = 0; i < txt.length(); i++) {
                int aux1 = txt.codePointAt(i) - 65;
                int aux2 = key.codePointAt(i) - 65;
                
                aux1 = (aux1 - aux2 + 26) % 26 + 65;
                result = result.concat(Character.toString((char)aux1));
            }
    
    
            System.out.println("\n[RESULTADO] " + result + "\n");
        }
        
        public static void main(String[] args) throws Exception {        
            exec(args);
        }
    }
    Última edição por .Nero; 10 Nov 2013 às 14:19.
    - kiss principle -
    - repeat after me: harem -


  3. #3
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    pequena mudança para ficar mais estilo perl

    Código PHP:
    #!usr/bin/env perl
    use warnings;
    use 
    strict;
    use 
    feature 'say';
    # passa o hex ASCII para upercase
    sub toupper{ord(uc chr $_[0])}
    # confere se o valor hex ASCII é alphabeto
    sub isalpha{chr($_[0]) =~ /[a-zA-Z]/}
    # converte o valor para hex ASCII
    sub tochar{map ordsplit //, $_[0]}
    sub encode{    my @word tochar($_[0]);
        
    my @key tochar($_[1]);
            
    my ($a$tword);
            for (
    $a 0$a < @word$a++){
            if(
    isalpha($word[$a]) && isalpha($key[$a])){
                                
    $word[$a] = toupper($word[$a]) - 65;
                
    $key[$a] = toupper($key[$a]);
                            
    my $cript $key[$a] + $word[$a]; 
                if (
    $cript >= 91){
                    
    $cript -= 26;
                }
                            
    $word[$a] = $cript;
                 
    $tword .= chr $word[$a];
            }
        }
            return 
    $tword;
                }
    sub decode{
        
    my @word tochar($_[0]);
        
    my @key tochar($_[1]);
            
    my ($a$tword);
            for (
    $a 0$a < @word$a++){
            if(
    isalpha($word[$a]) && isalpha($key[$a])){
                                
    $word[$a] = toupper($word[$a]);
                
    $key[$a] = toupper($key[$a]);
                            
    my $cript =  $word[$a] - $key[$a] +65
                if (
    $cript <= 64){
                    
    $cript += 26;
                }
                            
    $word[$a] = $cript;
                 
    $tword .= chr $word[$a];
            }
        }
        return 
    $tword;
    }
    sub help{
         print 
    "\n[+] Cifra de Vigenere\n";
         print 
    "[0] Coder => guedes.acp\n\t\treleitura de MMxM";
         print 
    "\n\tModo de uso: $0 <palavra> <chave> <e|d>\n";
         print 
    "\n\t \"A chave e a palavra devem ter o mesmo tamanho\"\n\n";
         exit(
    0);
     }
     
    sub main{
        
    my $cmd;
        if(@
    ARGV != 3){
             
    help;
         }
              if(
    length($ARGV[0]) != length($ARGV[1])){
             
    help;
         }
        {
            if (
    $ARGV[2eq 'd'){
                 
    $cmd decode($ARGV[0], $ARGV[1]);
             }
            
    elsif ($ARGV[2eq 'e'){
                
    $cmd encode($ARGV[0], $ARGV[1]);
            }
            else {
                
    help;
            }
        }
        print 
    "PALAVRA: " $ARGV[0] . "\n";
         print 
    "CHAVE: " $ARGV[1] . "\n";
         print 
    "RESULTADO: " $cmd "\n\n";
     }
    main
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  4. #4
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    Estou me superando, de 93 para 57 linhas.
    E nem está enchuto, pois enchugando vai para 33 linhas mas fica sem graça.

    Reduzido:
    Código PHP:
    #!usr/bin/env perl
    use warnings;
    use 
    strict;
    use 
    feature 'say';

    # passa o hex ASCII para upercase
    sub toupper{ord(uc chr $_[0])}
    # confere se o valor hex ASCII é alphabeto
    sub isalpha{chr($_[0]) =~ /[a-zA-Z]/
    }
    # converte o valor para hex ASCII
    sub tochar{map ordsplit //, $_[0]}
    sub encode{(($_[0] + $_[1]) %26) + 65}
    sub decode{(($_[1] - $_[0]) %26) +65
    sub op{
        
    my ($w$k$opt) = @_;
        
    my @word tochar($w);
        
    my @key tochar($k);
        
    my ($a$tword);
            for (
    $a 0$a < @word$a++){
            if(
    isalpha($word[$a]) && isalpha($key[$a])){
                                
    $word[$a] = toupper($word[$a]);
                
    $key[$a] = toupper($key[$a]);
                
    my $cifra;
                if (
    $opt eq 'e'){
    $cifra encode($word[$a], $key[$a])
    }
                if (
    $opt eq 'd'){$cifra decode($word[$a], $key[$a]){
                    
    $tword .= chr $cifra;
            }
        }
            return 
    $tword;
                }
    sub help{
         print 
    "\n[+] Cifra de Vigenere\n";
         print 
    "[0] Coder => guedes.acp\n\t\treleitura de MMxM";
         print 
    "\n\tModo de uso: $0 <palavra> <chave> <e|d>\n";
         print 
    "\n\t \"A chave e a palavra devem ter o mesmo tamanho\"\n\n";
         exit(
    0);
     }
     
    sub main{
        
    my $cmd;
        if(@
    ARGV != 3){
             
    help;
         }
              if(
    length($ARGV[0]) != length($ARGV[1])){
             
    help;
         }
        
    $cmd op ($ARGV[0], $ARGV[1], $ARGV[2]);
        print 
    "PALAVRA: " $ARGV[0] . "\n";
         print 
    "CHAVE: " $ARGV[1] . "\n";
         print 
    "RESULTADO: " $cmd "\n\n";
     }
    main
    Limpo:
    Código PHP:
    #!usr/bin/env perluse warnings;
    use strict;
    use 
    feature 'say';
    sub toupper{ord(uc chr $_[0])}
    sub isalpha{chr($_[0]) =~ /[a-zA-Z]/}
    sub tochar{map ordsplit //, $_[0]}
    sub encode{(($_[0] + $_[1]) %26) + 65}
    sub decode{(($_[1] - $_[0]) %26) +65}
    sub op{
        
    my ($w$k$opt) = @_;
        
    my @word tochar($w);
        
    my @key tochar($k);
        
    my ($a$tword);
            for (
    $a 0$a < @word$a++){
            if(
    isalpha($word[$a]) && isalpha($key[$a])){
                                
    $word[$a] = toupper($word[$a]);
                
    $key[$a] = toupper($key[$a]);
                
    my $cifra;
                if (
    $opt eq 'e'){$cifra encode($word[$a], $key[$a])}
                if (
    $opt eq 'd'){$cifra decode($word[$a], $key[$a])}
                    
    $tword .= chr $cifra;}}
            return 
    $tword;}
    sub help{
         print 
    "\n[+] Cifra de Vigenere\n";
         print 
    "[0] Coder => guedes.acp\n\t\treleitura de MMxM";
         print 
    "\n\tModo de uso: $0 <palavra> <chave> <e|d>\n";
         print 
    "\n\t \"A chave e a palavra devem ter o mesmo tamanho\"\n\n";
         exit(
    0);
     }
    my $cmd op ($ARGV[0], $ARGV[1], $ARGV[2]);
    say $cmd
    E minha palavra final e código pequeno. (15 linhas):

    Código PHP:
    #!usr/bin/env per
    luse common::sense;
    my $opt $ARGV[2]
    ;
    my @word split //, $ARGV[0];
    my @key split //,$ARGV[1];
    my ($a$tword);
        for (
    $a 0$a < @word$a++){
        if((
    $word[$a] =~ /[a-zA-Z]/) and ($key[$a] =~ /[a-zA-Z]/)){
                
    $word[$a] = ord(uc($word[$a]));
            
    $key[$a] = ord(uc($key[$a]));
            if (
    $opt eq 'e'){$tword .= chr ((($word[$a] + $key[$a])%26) + 65)}
            if (
    $opt eq 'd'){$tword .= chr ((($word[$a] - $key[$a])%26) + 65)}}}
        
    say $tword
    O ruim de código pequeno é que a tendencia de quanto menor mais ilegível.
    No caso não está tão ilegível, mas também eu não trato as coisas em classes, ou seja não da para aproveitar nada, mas é funcional.
    Também não vem com instruções do tipo usage.
    Bom, adorei a ideia do desafio, valeu mmxm, sua iniciativa me estimulo.

    mas caso precise de um usage é só colar junto do código:

    Código PHP:
    if (@ARGV !=3){    say "usage:\n\tperl " , $0" 'word' 'key <e|d>";} 
    Última edição por guedes.acp; 11 Nov 2013 às 15:04.
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  5. #5
    Membro ingresso
    Data de Ingresso
    Apr 2012
    Posts
    70
    Post Thanks / Like
    tbm fiz um código pequeno em perl

    Código PHP:
    #!/usr/bin/perl -w

    die("\nUso: $0 <palavra> <chave> <d|e>\n\n") if($#ARGV != 2 || length($ARGV[0]) != length($ARGV[1]));
    my @word split('',uc($ARGV[0]));
    my @key split('',uc($ARGV[1]));
    for(
    my $i=0;$i<scalar(@word);$i++){
            
    next if($word[$i] !~ /[A-Z]/ || $key[$i] !~ /[A-Z]/);
            print 
    chr(((ord($word[$i])+ord($key[$i]))%26) + 65) if(lc($ARGV[2]) eq 'e');
            print 
    chr(((ord($word[$i])-ord($key[$i]))%26) + 65) if(lc($ARGV[2]) eq 'd');
    } print 
    "\n"

  6. #6
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    Falei que não postaria mais outra versão, e cumprirei com a palavra.

    Mas vou dar a dica que nos leva economizar muitas e muitas linhas:

    No começo demora a habituar, mas depois parece que fica tudo mais fácil.
    Ele é mágico, é como se transformasse Perl5 em OO (e não com suporte a OO como é),
    acaba que lembra um pouco Perl6.
    Você pode programar em Perl5 usando a estrutura de POO quando você adota classes que criam objetos propriamente dito: vide Moose.
    Mas com o autobox::Core, você passa usar as funções do Perl como se fosse OO.

    Fica a dica para quem quiser tentar.

    Exemplo de uso:
    http://pastebin.com/jefw6hfe
    Última edição por guedes.acp; 11 Nov 2013 às 21:20.
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  7. #7
    Veterano ingresso
    Data de Ingresso
    Jan 2011
    Localização
    Pguá ~ PR
    Posts
    2.363
    Post Thanks / Like
    Eis minha versão em Python, por favor não me matem!

    Código:
    #!/usr/bin/python
    
    from sys import argv
    from getopt import getopt, GetoptError
    
    def chk(foo, bar):
        if len(foo) == 0 or not foo.isalpha():
            exit("Chave invalida, entre com caracteres alfabeticos")    
        if len(bar) == 0 or not bar.isalpha():
            exit("Texto contem caracteres nao permitidos")
        if len(foo) != len(bar):
            exit("A chave e o texto precisam ter o mesmo comprimento")    
                
    def vgencode(key, word):
        result = ''
        for n in range(len(word)):
            cifra = (ord(word[n]) + ord(key[n]) - 97)
            if (word[n].islower() and 97 < cifra > 122) or (word[n].isupper() and 65 < cifra > 90):
                cifra -= 26
            result += chr(cifra)      
        return result
        
    def vgdecode(key, word):
        result = ''
        for n in range(len(word)):
            cifra = (ord(word[n]) - ord(key[n]) + 97)
            if (word[n].islower() and ( 122 > cifra < 97)) or (word[n].isupper() and (90 > cifra < 65)):
                cifra += 26
            result += chr(cifra)    
        return result    
        
    def say(m, k, t, c):
        if m == 'e': print "Chave: {0}\tTexto: {1}\tCifra: {2}".format(k, t, c)    
        elif m == 'd': print "Chave: {0}\tCifra: {1}\tTexto: {2}".format(k, t, c)
    
    def main():
        key, text, op = '', '', ''
        try:
            opts, args = getopt(argv[1:], 'edc:t:')
            for o, a in opts:
                if o == '-c': key = a
                elif o == '-t': text = a
                elif o == '-e': op = 'e'
                elif o == '-d': op = 'd'
            chk(key, text)    
            if op == 'e':
                ret = vgencode(key, text)
                say('e', key, text, ret)
            elif op == 'd':
                ret = vgdecode(key, text)
                say('d', key, text, ret)        
            
        except GetoptError:
            exit("Parametro desconhecido")            
    
    main()
    Modo de utilização:

    1. Para cifrar:
      Código:
      ~$ python viginere.py -e -c <Chave> -t <Texto>
    2. Para decifrar:
      Código:
      ~$ python viginere.py -d -c <Chave> -t <Cifra>

  8. #8
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    Finalmente uma solução e Python.
    XD

    Eu nunca me dou bem em usar o Getopt
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •