奇尔卡特加密没有按预期工作

Chilkat encryption doesn't work as expected

我正在尝试使用 chilkat 功能测试文件加密。根据 this 示例页面上的代码,我将最后一部分替换为:

#  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 模式不推荐用于文件加密,因为如果一个块丢失,其他块也会丢失。 输出文件已损坏,当我查看两个文件的 beyond compare 时,有文件块匹配,也有文件块不匹配。我做错了什么?

您正在尝试使用 字符串 加密(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 站点,这里有二进制数据的示例代码。

我将编写 post 一个 link 示例,该示例比 post 此处提供的示例要好得多。 post 此处提供的示例不太正确。有两个重要的 Chilkat Crypt2 属性需要注意:FirstChunkLastChunk。默认情况下,这两个属性都为真(或 Perl 中的值 1)。这意味着对于给定的 encrypt/decrypt 调用,例如 EncryptBytes、DecryptBytes 等,它假定传递了全部数据。对于 CBC 模式,这很重要,因为 IV 用于第一个块,对于最后一个块,根据 PaddingScheme[=27= 的值将输出填充到算法的块大小] 属性.

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

  1. 对于第一个块,设置 FirstChunk=1,LastChunk=0。
  2. 对于中间块,​​设置 FirstChunk=0,LastChunk=0。
  3. 对于最终块(即使是 0 字节的最终块),设置 FirstChunk=0,LastChunk=1。这会导致发出最终的填充输出块。

使用 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 流结束。

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