Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

encriptador por bits
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto
Mensaje Mar Nov 01, 2005 2:15 pm
sudo
Perlero Nuevo
Perlero Nuevo
Registrado: 01 Oct 2005
Mensajes: 14
encriptador por bits Responder citando

Hola forer@s!
Hace rato hice un encriptador/decryptador que hacía su función por caracteres, ahora lo quiero hacer por bits.
Entonces mi pregunta es la siguiente:
¿Cómo encripto por bits, SIN usar algún módulo de CPAN?
Gracias.
Rolling Eyes
Mensaje Mar Nov 01, 2005 2:57 pm
explorer39
Perlero Frecuente
Perlero Frecuente
Registrado: 23 Ago 2005
Mensajes: 126
Ubicación: Valladolid, España
Responder citando

Puedes utilizar las funciones pack, unpack y vec.
Mensaje Mie Nov 02, 2005 2:18 pm
sudo
Perlero Nuevo
Perlero Nuevo
Registrado: 01 Oct 2005
Mensajes: 14
Responder citando

Smile Hola.
No mira, yo lo que quiero es saber como encripto por entrada de bits, es decir:
Tengo un binario o un .elf, lo quiero encriptar, pero claro esta, tengo que saber el orden de bits por el que inicia hasta en el que termina el binario/elf.
Entonses como se por donde iniciar?
Cuantos bits escribir al decriptarlo?
El orden de los caracteles?
Yo se que estas funciones es para trabajar con ASCii, pero no se como guardar o escibir por orden bits, como un binario.Crying or Very sad
Gracias, de nuevo! Wink
Mensaje Mie Nov 02, 2005 2:47 pm
explorer39
Perlero Frecuente
Perlero Frecuente
Registrado: 23 Ago 2005
Mensajes: 126
Ubicación: Valladolid, España
Responder citando

Que si, que si... que vec sirve para tratar bits en cadenas de bytes almacenadas en strings... y con pack/unpack puedes leer ristras de bytes.
Abres el fichero que quieres encriptar. Haces un bucle hasta el final del fichero. Leer una ristra de bits según unpack. Encriptas con vec. Almacenas en otro fichero con pack. Listo Smile
Todo dependerá de tu método de encriptación.
Mensaje Mie Nov 02, 2005 5:37 pm
sudo
Perlero Nuevo
Perlero Nuevo
Registrado: 01 Oct 2005
Mensajes: 14
Responder citando

OK, digamos que Mr. Green vec me solucione el prloblema, pero... Si quiero decriptarlo?
Bien, otra dudilla, la fincion crypt() es decriptable?
Gracias, salu2!
Mensaje Mie Nov 02, 2005 6:42 pm
monoswim
Vive para Perl en Español
Vive para Perl en Español
Registrado: 18 Nov 2003
Mensajes: 716
Ubicación: Buenos Aires
Responder citando

No, la función crypt() es una función solo de ida, no de vuelta...

Sirve mucho para por ejemplo encriptar passwords y luego verificas si el password es correcto encriptando el que coloca el usuario y comparrando ambos passwords encriptados...Pero no se puede desencriptar...

Saludos
Mensaje Vie Nov 04, 2005 5:03 pm
sudo
Perlero Nuevo
Perlero Nuevo
Registrado: 01 Oct 2005
Mensajes: 14
Responder citando

Código:
open FL, "text";
my @lines = <FL>;
my $aline;
my $a = 0;
close FL;
foreach(0 .. $#lines) {$aline = "$aline$lines[$a++]";}
my $palabras = unpack("b*", $aline);
print "$palabras\n";
my $all = pack("b*", $palabras);
open QT, "+>txt.dat";
print QT "$all";
close QT;
Funciona al 100%. ¡gracias a todos!
salu2
Mensaje Jue Ago 30, 2007 6:50 am
aramallal
Perlero Nuevo
Perlero Nuevo
Registrado: 12 Jun 2007
Mensajes: 63
Responder citando

Podríais explicarme este código, por favor.
Por que lo que necesito es encriptar un fichero de texto pero no sé cómo hacerlo.

Mi script se encargará de leer la información desencriptando el fichero.

Un millón de gracias y un saludo.
Mensaje Jue Ago 30, 2007 11:34 am
monoswim
Vive para Perl en Español
Vive para Perl en Español
Registrado: 18 Nov 2003
Mensajes: 716
Ubicación: Buenos Aires
Responder citando

Perl:
open FL, "text";              # abre al archivo...
my @lines = <FL>;             # guarda toda la info del archivo en el array @lines
my $aline;                     
my $a = 0;                    # crea 2 variables que se utilizarán luego
close FL;                     # cierra el archivo

foreach(0 .. $@lines) {$aline = "$aline$lines[$a++]";}  # deja toda la info del archivo en un string $aline (modifiqué un error que había en el código)

my $palabras = unpack("b*", $aline)# desencripta la info...
print "$palabras\n";                  # imprime la info en Humano
my $all = pack("b*", $palabras);      # vuelve a encriptar la info para luego guardarla en el archivo

open QT, "+>txt.dat";
print QT "$all";
close QT;


Espero que te sirva

Saludos
Mensaje Jue Ago 30, 2007 11:55 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4123
Ubicación: Valladolid, España
Responder citando

Perl:
foreach(0 .. $#lines) {$aline = "$aline$lines[$a++]";}
Estaba bien, MonoSwim. El que has puesto sí que está mal.
Mensaje Jue Ago 30, 2007 2:39 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 486
Ubicación: Frente al monitor
Responder citando

aramallal escribió:
Podríais explicarme este código, por favor.
Por que lo que necesito es encriptar un fichero de texto pero no sé cómo hacerlo.

Mi script se encargará de leer la información desencriptando el fichero.

Un millón de gracias y un saludo.

Realmente no te lo recomiendo, es que estaba aprendiendo... Laughing

Eso sería, bueno no sé que sería pero es mejor que uses PGP y Blowfish
Embarassed
Mensaje Vie Ago 31, 2007 12:25 am
aramallal
Perlero Nuevo
Perlero Nuevo
Registrado: 12 Jun 2007
Mensajes: 63
Responder citando

Muchas gracias a todos.

Creo que intentaré el que me habéis dejado aquí.

Me estoy quedando sin tiempo y ya le he dedicado mas de dos dias a esto sin sacar nada en claro, bueno sí, que utilice pgp y blowfish pero no entiendo la documentación de cómo utilizarlos.

Asi que probaré con el que me habéis dejado. Gracias y un saludo.
Mensaje Vie Ago 31, 2007 1:16 am
aramallal
Perlero Nuevo
Perlero Nuevo
Registrado: 12 Jun 2007
Mensajes: 63
Responder citando

el fichero que utilizo en: open FL, "txt"


Debería tener mi usuario y mi password cifrado como lo hago?

os lo digo porque para hacer una prueba yo he puesto cisco cisco .

Entonces el programa parece que lo cifra me li imprime por pantalla y lo guarda en el "txt.dat" como esta en el original " cisco cisco".


No entiendo el sentido de esto. alguien me lo puede explicar.
Mensaje Vie Ago 31, 2007 1:44 am
aramallal
Perlero Nuevo
Perlero Nuevo
Registrado: 12 Jun 2007
Mensajes: 63
Responder citando

vale ya lo entiendo perfectamente.Gracias ....
Mensaje Vie Ago 31, 2007 2:44 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4123
Ubicación: Valladolid, España
Responder citando

A ver si esto te sirve.

Estoy usando el módulo Crypt::Blowfish, que es sencillo, solo codifica en bloques de 8 bytes, por lo que nos servirá para codificar nombres de usuarios y sus contraseñas de justo ese tamaño (o menor).

El módulo me lo he bajado de la Universidad de Winnipeg, con la ayuda del instalador PPM (en Windows) en un minuto. Si estás en un Unix/Linux, prueba con el comando cpan.

Si tenemos por ejemplo este fichero, usuarios.txt:
Código:
#
# Lista de usuarios y contraseñas
#
aramalla:blowfish
joaquin:anguloso

con el siguiente programa:
Perl:
#!Perl
use Crypt::Blowfish;

my $clave = 'asquerRs';                   # Clave para cifrar/descifrar

#########################################################################
print "Codificando:\n";
my $cifra = Crypt::Blowfish->new($clave);

# Abrimos el fichero
open my $fh, '<', 'usuarios.txt'
    or die "ERROR: no puedo abrir el fichero de usuarios original: $!\n";

# Escribimos en el fichero de salida
open my $ch, '>', 'usuarios.blw'
    or die "ERROR: no puedo escribir en el fichero de salida: $!\n";

# lo leemos línea a línea, encriptando
while ( <$fh> ) {

    chomp;

    next if m/^ \s* \#/ximo;    # Obviamos líneas vacías o comentarios

    if ( my ($usuario,$contrasena) = split q{:} ) {

        print "$usuario:$contrasena=>";
        $usuario    = codifica( $usuario );
        $contrasena = codifica( $contrasena );
        print "$usuario:$contrasena\n";

        # Lo escribimos. El resultado siempre es de 8 caracteres cada uno
        print $ch "$usuario$contrasena\n";
    }
}

# Fin de la codificación
close $fh;
close $ch;

print "\n";

#########################################################################
print "Decodificando:\n";
my $descifra = Crypt::Blowfish->new($clave);

# Abrimos el fichero codificado
open my $dh, '<', 'usuarios.blw'
    or die "ERROR: no puedo abrir el fichero codificado: $!\n";

# lo leemos línea a línea, desencriptando
while ( <$dh> ) {

    chomp;

    # Las líneas son dos bloques de 8 caracteres cada uno
    if ( my ($usuario,$contrasena) = unpack "A8 A8", $_ ) {

        print "$usuario:$contrasena=>";
        $usuario    = decodifica( $usuario );    # Decodificamos
        $contrasena = decodifica( $contrasena ); # Decodificamos
        print "$usuario:$contrasena\n";
    }
}

# Fin de la decodificación
close $dh;

#########################################################################
sub codifica {
    my $que = shift;
    $que = substr $que."\0"x8,0,8;               # Ajustamos a 8 caracteres, relleno con ceros
    return $cifra->encrypt($que);                # Codificamos y devolvemos el resultado
}

sub decodifica {
    my $que = shift;
    $que = $descifra->decrypt($que);             # Decodifica
    $que =~ s/\0+$//;                            # y quitamos los ceros de relleno
    return $que;
}
__END__

la salida es:
Código:
Codificando:
aramalla:blowfish=>ˆÓדó¼ÛT:¶Ù[Y³Fì
joaquin:anguloso=>dPò)`Î�:Åk@¼­Õ

Decodificando:
ˆÓדó¼ÛT:¶Ù[Y³Fì=>aramalla:blowfish
dPò)`Î�:Åk@¼­Õ=>joaquin:anguloso


Funciona. El fichero usuarios.txt es codificado a usuarios.blw. Y luego, decodificado, para sacar su contenido original.

Lo que tienes que hacer es sacar dos programas de este: uno para codificar solamente, y el otro para decodificar y usar la información para trabajar. El fichero usuarios.txt deberás guardarlo en sitio seguro, claro.

Si queremos codificar texto de más longitud de 8 caracteres habría que dividirlo en bloques de ese tamaño y hacer un bucle por ellos.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto Todas las horas son GMT - 6 Horas
Ir a página 1, 2  Siguiente
Página 1 de 2



Powered by phpBB © 2001, 2005 phpBB Group