2009-07-01 5 views
1

Bonne journée! J'ai ici un code qui utilise l'algorithme blowfish_PP de Crypt::Blowfish_PP pour crypter un mot de passe.Pourquoi Blowfish :: PP ne crypte-t-il que cinq caractères?

J'ai fourni un échantillon variable « clé » pour commencer (bien que je ferai une fonction plus tard qui incrémente chaque fois que je touche utilise), mais pour l'instant ce que j'ai:

use Crypt::Blowfish_PP; 

$key = "12345678"; 
$$plaintextBlock = "mystringhere"; 

$blowfish=new Crypt::Blowfish_PP($key); 

$ciphertextBlock=$blowfish->encrypt($plaintextBlock); 

$plaintextBlock=$blowfish->decrypt($ciphertextBlock); 

print "\n"; 
print $ciphertextBlock."\n"; 
print $plaintextBlock."\n"; 

Cette $ciphertextBlock produit SEULEMENT 5 caractères. Lorsque j'ai vérifié le encryptedpassword d'autres DB en utilisant MD5, il contient plusieurs caractères. Pourquoi donc? Qu'y a-t-il à l'intérieur des fonctions et decrypt()? Est-ce que la valeur "clé" importe sur combien de temps le mot de passe crypté sera?

Les réponses seront très appréciées. =)

Répondre

3

Selon Blowfish_PP documentation, encrypt et decrypt ne fonctionnent que sur un seul bloc de 8 octets à la fois. Donc, si vous cryptez des chaînes plus longues, vous devez appeler encrypt à plusieurs reprises. Pourquoi il ne sort que 5 "caractères" est probablement parce que le texte chiffré contient des caractères non imprimables. Si vous souhaitez imprimer les données, convertissez-les par ex. ascii hexagonal premier:

print sprintf("%02x"x8, unpack("C8", $ciphertextBlock)), "\n"; 
2

Comme l'a dit laalto, Blowfish_PP (parce qu'il est Blowfish, non pas parce qu'il est _PP) travaille sur des blocs.

Le traitement de ce problème est généralement complexe, c'est pourquoi vous avez un module qui encapsule (virtuellement) n'importe quel module Crypt :: * qui fournit un chiffrement par bloc, et vous permet de l'utiliser de manière beaucoup plus simple.

Par exemple, votre code avec Crypt :: CBC serait:

#!/usr/bin/perl -w 
use strict; 
use Crypt::CBC; 

my $key = "12345678"; 
my $plaintextBlock = "mystringhere"; 

my $cipher = Crypt::CBC->new(
    -key => $key, 
    -cipher => 'Blowfish_PP' 
); 

my $ciphertext = $cipher->encrypt($plaintextBlock); 
# my $textual = $ciphertext; 
# $textual =~ s/([^a-zA-Z0-9])/sprintf "\\x%02x", ord $1/ge; 
# print "ciphertext: [$textual]\n"; 
print "ciphertext: [$ciphertext]\n"; 

my $plaintext = $cipher->decrypt($ciphertext); 
print "plaintext: [$plaintext]\n"; 

Rappelez-vous que cryptogramme est flux d'octets, il est donc pas vraiment imprimable. Vous voudrez peut-être décompacter 3 lignes dans le code (en commençant par $ textual = $ ciphertext) pour afficher le texte chiffré de manière plus lisible.

L'avantage supplémentaire de l'utilisation de Crypt :: CBC est que si vous voulez passer à un autre algorithme, c'est juste un changement dans l'appel Crypt :: CBC-> new(). Par ailleurs - pourquoi crypter :: Blowfish_PP? Je veux dire, pourquoi ne pas Crypt :: Blowfish? La version _PP est généralement plus lente.

Note complémentaire, directement à partir Crypt::Blowfish, que l'on peut supposer être fonctionnellement équivalent à Crypt :: Blowfish_PP:

Le module est capable d'être utilisé avec Crypt :: CBC. Vous êtes encouragé à lire le perldoc pour Crypt :: CBC si vous l'intention d'utiliser ce module pour Cipher modes de chaînage de blocs.En fait, si avez l'intention de crypter plus de que huit octets de données avec ceci, ou n'importe quel autre chiffrement de bloc, vous allez pour avoir besoin d'un type d'aide de chaînage de bloc . Crypt :: CBC a tendance à être très bon dans ce domaine. Si vous ne cryptez pas plus de huit octets, vos données doivent avoir exactement huit octets de long. Si nécessaire, faites votre propre rembourrage. "\ 0" comme un octet nul est parfaitement valide pour utiliser pour cela.

2

changez $ clairBloc à $ clairBloc, cela fonctionnera pour les 8 premiers octets.

Questions connexes