Chilkat加密并没有按预期工作

时间:2017-05-27 09:12:08

标签: perl encryption chilkat

我尝试使用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模式不建议用于文件加密,因为如果一个块丢失,其他块也会丢失。 输出文件已损坏,当我在两个文件中查看超出比较时,有一些文件块匹配,并且有一些文件块没有。我做错了什么?

3 个答案:

答案 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 属性的值填充到算法的块大小。

通过执行以下操作,可以将输入数据反馈到加密器块:

  1. 对于第一个块,设置FirstChunk = 1,LastChunk = 0.
  2. 对于中间块,​​设置FirstChunk = 0,LastChunk = 0。
  3. 对于最后的块(即使是0字节的最终块),设置FirstChunk = 0,LastChunk = 1。这会导致发出最终填充的输出块。
  4. 使用FirstChunk / LastChunk传递块时,不需要担心传递与算法块大小匹配的块。如果传入部分块,或者字节不是块大小的精确倍数(AES为16字节),则Chilkat将缓冲输入,部分块将添加到下一个块中传递的数据中。例如:

    1. FirstChunk = 1,LastChunk = 0,传入23个字节,输出为16个字节,缓冲7个字节。
    2. FirstChunk = 0,LastChunk = 0,传入23个字节,输出为16个字节,(46-32个字节)14个字节缓冲
    3. FirstChunk = 0,LastChunk = 1,传入5个字节,输出为32个字节,(14个缓冲字节+ 5个以上= 19个字节.19个字节是一个完整的块(16个字节)加上3个字节的剩余部分,这是填充为16,因此输出为32字节,CBC流结束。

答案 2 :(得分:0)

此示例演示如何使用FirstChunk / LastChunk。以下是示例:https://www.example-code.com/perl/encrypt_file_chunks_cbc.asp