2017-05-26 50 views
1

我创建了一个算法来加密和解密Perl中的字符串(在CFB模式下使用AES)。现在我想扩展到文件级别的加密。我应该如何获取文件的内容?什么是一个好方法?使用Perl加密文件

  1. 阅读这个文件通常
    open(my $fh, "<", "myTestFile.ext");
  2. 阅读binmode文件
    open(my $fh, "<", "myTestFile.ext"); binmode $fh

那么应该怎么存储文件的内容?

一个)阅读该文件的所有内容在一个串并提供串所实现的程序

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

b)以线读取文件行的​​内容

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

在这两种情况下,我应该chomp \n的?

回答

2

AES加密的128位(16个字节)的,所以你要在一个时间来阅读您的文件16个字节。要做到这一点,你需要binmode您的文件,然后用read内置阅读:

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

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

注意打开该文件后,我已经增加or die $!:要始终确保您的open工作。

另外,不要忘记,如果你读块小于16个字节长,你就必须做一些填充。 (我不记得了块如何填补了AES,但我相信你,因为你是实现它)


关于你想到了办法:

  • 读取整个文件如果文件很大,则会立即消耗大量内存。

  • 逐行读取文件中的行:如果文件不包含换行,那么你就完全在一次读它,这可能会消耗大量的内存。如果行包含的字节数不是16的倍数,那么您必须将不同行的字节组合在一起,这需要比简单读取16字节块更多的工作。

而且,你绝对不希望任何chomp!你应该有decrypt(encrypt(file)) == file,但如果你chomp换行符,那将不再是这种情况了。

+0

谢谢您的解释和解决方案。我是这个主题的新手,我不得不做一个学校项目 – Adrian