奇尔卡特加密没有按预期工作
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 属性需要注意:FirstChunk 和 LastChunk。默认情况下,这两个属性都为真(或 Perl 中的值 1)。这意味着对于给定的 encrypt/decrypt 调用,例如 EncryptBytes、DecryptBytes 等,它假定传递了全部数据。对于 CBC 模式,这很重要,因为 IV 用于第一个块,对于最后一个块,根据 PaddingScheme[=27= 的值将输出填充到算法的块大小] 属性.
可以通过执行以下操作将输入数据逐块馈送到加密器:
- 对于第一个块,设置 FirstChunk=1,LastChunk=0。
- 对于中间块,设置 FirstChunk=0,LastChunk=0。
- 对于最终块(即使是 0 字节的最终块),设置 FirstChunk=0,LastChunk=1。这会导致发出最终的填充输出块。
使用 FirstChunk/LastChunk 传递块时,无需担心传递的块与算法的块大小相匹配。如果传入部分块,或者如果字节不是块大小的精确倍数(AES 为 16 字节),则 Chilkat 将缓冲输入并将部分块添加到下一个块中传递的数据中。例如:
- FirstChunk=1,LastChunk=0,传入23字节,输出16字节,缓冲7字节。
- FirstChunk=0,LastChunk=0,传入23字节,输出为16字节,(46-32字节)缓冲14字节
- 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
我正在尝试使用 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 属性需要注意:FirstChunk 和 LastChunk。默认情况下,这两个属性都为真(或 Perl 中的值 1)。这意味着对于给定的 encrypt/decrypt 调用,例如 EncryptBytes、DecryptBytes 等,它假定传递了全部数据。对于 CBC 模式,这很重要,因为 IV 用于第一个块,对于最后一个块,根据 PaddingScheme[=27= 的值将输出填充到算法的块大小] 属性.
可以通过执行以下操作将输入数据逐块馈送到加密器:
- 对于第一个块,设置 FirstChunk=1,LastChunk=0。
- 对于中间块,设置 FirstChunk=0,LastChunk=0。
- 对于最终块(即使是 0 字节的最终块),设置 FirstChunk=0,LastChunk=1。这会导致发出最终的填充输出块。
使用 FirstChunk/LastChunk 传递块时,无需担心传递的块与算法的块大小相匹配。如果传入部分块,或者如果字节不是块大小的精确倍数(AES 为 16 字节),则 Chilkat 将缓冲输入并将部分块添加到下一个块中传递的数据中。例如:
- FirstChunk=1,LastChunk=0,传入23字节,输出16字节,缓冲7字节。
- FirstChunk=0,LastChunk=0,传入23字节,输出为16字节,(46-32字节)缓冲14字节
- 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