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: Seleccionar todo
#
# Lista de usuarios y contraseñas
#
aramalla:blowfish
joaquin:anguloso
con el siguiente programa:
Using perl Syntax Highlighting
#!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__Coloreado en 0.005 segundos, usando
GeSHi 1.0.8.4
la salida es:
- Código: Seleccionar todo
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.