2017-05-26 75 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