2017-05-26 3 views
1

J'ai créé l'algorithme pour chiffrer et déchiffrer une chaîne en Perl (en utilisant AES en mode CFB). Maintenant, je veux étendre au cryptage au niveau du fichier. Comment devrais-je obtenir le contenu du fichier? Quelle serait une bonne approche?Chiffrer le fichier en Perl

  1. Lire le fichier normalement
    open(my $fh, "<", "myTestFile.ext");
  2. Lire le fichier dans binmode
    open(my $fh, "<", "myTestFile.ext"); binmode $fh

Alors, comment dois-je stocker le contenu des fichiers?

a) Lire tout le contenu du fichier dans une chaîne et de fournir la chaîne au programme mis en œuvre

my $document = do { 
    local $/ = undef; 
    <$fh>; # file handle opened previously 
}; 
encryptionAlgorithm($document); 

b) Lire le contenu de la ligne de fichiers en ligne

while(my $line = <$fh>) 
{ 
    encryptionAlgorithm($line); 
} 

En les deux cas dois-je chomp le \n?

Répondre

2

AES crypte les blocs de 128 bits (16 octets), vous aurez donc besoin de lire votre fichier de 16 octets à la fois. Pour ce faire, vous devez binmode votre fichier, puis le lire avec le read builtin:

open my $fh, '<', 'myTestFile.ext' or die $!; 
binmode $fh; 

while (read($fh,my $block,16)) { 
    # encrypt $block 
} 

Notez que j'ai ajouté or die $! après l'ouverture du fichier: vous voulez toujours vous assurer votre open travaillé. De plus, n'oubliez pas que si le bloc que vous avez lu mesure moins de 16 octets, vous devrez faire un peu de remplissage. (Je ne me souviens pas comment les blocs sont rembourrés pour AES, mais je fais confiance que vous faites depuis que vous implémentez il)


A propos des approches que vous pensiez de:

  • Lire le dossier complet à la fois va potentiellement consommer beaucoup de mémoire si le fichier est grand. Lire le fichier ligne par ligne: si le fichier ne contient pas de nouvelle ligne, alors vous le lirez immédiatement, ce qui pourrait consommer beaucoup de mémoire. Et si les lignes contiennent un nombre d'octets qui n'est pas un multiple de 16, alors vous devrez combiner des octets provenant de différentes lignes, ce qui nécessitera plus de travail que la simple lecture de blocs de 16 octets.

De plus, vous ne voulez absolument pas chomp quoi que ce soit! Vous devriez avoir decrypt(encrypt(file)) == file, mais si vous chomp les nouvelles lignes, ce ne sera plus le cas.

+0

Merci pour les explications et pour la solution. Je suis nouveau sur le sujet et je dois faire un projet d'école – Adrian