我尝试使用chilkat
功能测试文件加密。根据{{3}}示例页面上的代码,我将最后一部分替换为:
# Encrypt a string...
# The input string is 44 ANSI characters (i.e. 44 bytes), so
# the output should be 48 bytes (a multiple of 16).
# Because the output is a hex string, it should
# be 96 characters long (2 chars per byte).
my $input = "sample.pdf";
# create file handle for the pdf file
open my $fh, '<', $input or die $!;
binmode ($fh);
# the output should be sample.pdf.enc.dec
open my $ffh, '>', "$input.enc.dec" or die $!;
binmode $ffh;
my $encStr;
# read 16 bytes at a time
while (read($fh,my $block,16)) {
# encrypt the 16 bytes block using encryptStringEnc sub provided by chilkat
$encStr = $crypt->encryptStringENC($block);
# Now decrypt:
# decrypt the encrypted block
my $decStr = $crypt->decryptStringENC($encStr);
# print it in the sample.pdf.enc.dec file
print $ffh $decStr;
}
close $fh;
close $ffh;
声明: 我知道CBC模式不建议用于文件加密,因为如果一个块丢失,其他块也会丢失。 输出文件已损坏,当我在两个文件中查看超出比较时,有一些文件块匹配,并且有一些文件块没有。我做错了什么?
答案 0 :(得分:3)
您尝试使用字符串加密(encryptStringENC()
,decryptStringENC()
),至少部分是二进制文件
这对我有用:
my $input = "sample.pdf";
# create file handle for the pdf file
open my $fh, '<', $input or die $!;
binmode $fh;
# the output should be sample.pdf.enc.dec
open my $ffh, '>', "$input.enc.dec" or die $!;
binmode $ffh;
my $inData = chilkat::CkByteData->new;
my $encData = chilkat::CkByteData->new;
my $outData = chilkat::CkByteData->new;
# read 16 bytes at a time
while ( my $len = read( $fh, my $block, 16 ) ) {
$inData->clear;
$inData->append2( $block, $len );
$crypt->EncryptBytes( $inData, $encData );
$crypt->DecryptBytes( $encData, $outData );
print $ffh $outData->getData;
}
close $fh;
close $ffh;
你可能更好地仔细阅读Chilkat网站,但是有二进制数据的示例代码。
答案 1 :(得分:0)
我将编写并发布一个示例链接,该链接比此处发布的示例要好得多。这里发布的示例不太正确。有两个重要的Chilkat Crypt2属性需要注意: FirstChunk 和 LastChunk 。默认情况下,这两个属性都为true(或Perl中的值为1)。这意味着对于给定的加密/解密调用,例如EncryptBytes,DecryptBytes等,它假定传递了全部数据。对于CBC模式,这很重要,因为IV用于第一个块,而对于最后一个块,输出根据 PaddingScheme 属性的值填充到算法的块大小。
通过执行以下操作,可以将输入数据反馈到加密器块:
使用FirstChunk / LastChunk传递块时,不需要担心传递与算法块大小匹配的块。如果传入部分块,或者字节不是块大小的精确倍数(AES为16字节),则Chilkat将缓冲输入,部分块将添加到下一个块中传递的数据中。例如:
答案 2 :(得分:0)
此示例演示如何使用FirstChunk / LastChunk。以下是示例:https://www.example-code.com/perl/encrypt_file_chunks_cbc.asp