2017-05-27 15 views
2

私はchilkat機能を使用してファイルの暗号化をテストしようとしていました。 this例のページで見つけたコードに基づいて、私はこれで最後の部分を置き換え:Chilkatの暗号化が期待通りに機能しない

# 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; 

免責事項: 私は1つのブロックが失われた場合、他のブロックが失われているためCBCモードは、ファイルの暗号化のために推奨されません知っていますあまりにも。 出力ファイルが壊れていて、2つのファイルを比較して比較すると、一致するファイルのチャンクがあり、一致しないファイルのチャンクがあります。私は間違って何をしていますか?

+0

'$ crypt'オブジェクトの種類がわからないと助けができません。どのように作成されますか? –

+0

@DaveCrossクイック検索では、これが* * fckであることがわかります。これをすべて1クラス* - [CkCrypt2](https://www.chilkatsoft.com/refdoc/vcCkCrypt2Doc.html)コンポーネントで行いましょう。 –

+2

@MaartenBodewes:C++ではなく、[Perlモジュール](https://www.chilkatsoft.com/refdoc/perlCkCrypt2Ref.html)にリンクすることを意味します。しかし、私の主張は、私たちがその検索をする必要はないはずだったということでした。 –

答えて

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; 

あなた可能性がバイナリデータのためのサンプルコードがあり、さらにいえチルカットサイトを熟読したほうが良いです。

+0

それも私のために働いた、ありがとう! – user30771

+2

間接オブジェクト表記法( 'new chilkat :: CkByteData()')を使わないでください。私はそれがドキュメントにあることを知っていますが、それは著者が多くのPerlを知らないという印です。間接的なオブジェクト表記法は、特定の状況で誤読される傾向があり、問題を追跡しながら多くの欲求不満を引き起こします。 'chilkat :: CkByteData-> new()'という代替構文を使用する方が良いでしょう。 –

+1

@DaveCross - updated。 –

0

ここに掲載されている例よりもはるかに優れたサンプルへのリンクを作成して投稿します。ここに掲載された例はあまり正確ではありません。 Chilkat Crypt2の2つの重要なプロパティがあります。FirstChunkおよびLastChunkです。デフォルトでは、これらのプロパティは両方ともtrueです(またはPerlの値1)。つまり、EncryptBytes、DecryptBytesなどの暗号化/復号化の呼び出しに対して、データ量がすべて渡されたとみなされます。 CBCモードでは、IVが最初のチャンクに使用され、最後のチャンクでは、PaddingSchemeプロパティの値に従って、出力がアルゴリズムのブロックサイズに埋め込まれるため、これは重要です。

一つではなく暗号化チャンクごとのチャンク以下の操作を行って入力データを供給することができる:第1のチャンクについて

  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バイト19バイトは1フルブロック(16バイト)+ 3バイト余りであり、16にパディングされているので、出力は32バイトであり、CBCストリームは終了する。
0

この例では、FirstChunk/LastChunkの使用例を示します。ここにその例があります:https://www.example-code.com/perl/encrypt_file_chunks_cbc.asp

+0

PS>を使用するためにアップロードされています。これにはChilkat v9.5.0.68以降が必要です。 (以前のバージョンではCkBinDataクラスがありませんでした。) – Matt

関連する問題