2

Delphi2007からXE2に移行する過程で、暗号化ライブラリをDCPCryptからTurbopowerLockbox3に切り替えることを検討しています。

a)DCPCryptでは、初期化ベクトルを明示的に制御できます。TPLB3でIVを設定するにはどうすればよいですか?

b)DCPCryptにはパディングがありません。暗号化の前に、平文にゼロをパディングします。TPLBはどのようにパッドしますか?もちろん、私たちはまだそれを自分たちで行うことができました。

テストベクトル

  • 暗号=AES-256;
  • 連鎖モード=CBC;
  • 終了=C#スタイルのオールゼロパディング;
  • IV送信=暗号文ストリームのクリアで先頭に追加された完全なブロック。
  • キー=33d46cffa158533194214a91e712fc2b45b587076675affd910edeca5f41ac64little-endien
  • IV = 917fe226df8308f4d96c33304768354a
  • 暗号文=+kdTGzdV5KZIw8tv466nhQ ==(base64)
  • 平文='a_decent_text'(ansistring)

ありがとう1月

4

1 に答える 1

3

a)IV

はじめに、解決する必要のない問題を解決しようとしている可能性があると言っておきます。Lockbox3は自動ソルトされています。つまり、ほとんどの場合、64ビットのナンスが自動的に生成されてIVに挿入されます。ナンス値は、暗号文ストリームへの挿入によって転送されます。結果として、IVを管理するためのコードを1行も記述せずに、TCodecコンポーネントを使用できます。それでも、ソルティング(基本的には予測不可能なIVを意味します)のすべての暗号化の利点が得られます。これは、IVをゼロにするか、IVを自己管理するDCPCryptとは対照的です。

「既知のテスト回答」テスト以外に、この動作をオーバーライドする必要があるシナリオを想像することはできませんが、実際に独自のIVの設定を主張したい場合は、cvsクライアントがある場合はそう言っています、リビジョン231(まだ「安定版リリース」ステータスではありません)をダウンロードし、TCodecコンポーネントのOnSetIV()イベントハンドラーを実装して、IVをカスタム値に設定できます。IVはメッセージとともに送信されるため、復号化時にこの手順は必要ありません。

デモコードが必要な場合はお知らせください。

b)パディング(最初の投稿から修正。エラーでごめんなさい。)

連鎖方法によります。標準ストリーム-ブロックアダプタを使用する場合、次の場合に終了が処理されます。

  • 長さゼロのメッセージ

長さゼロのメッセージは、長さゼロの暗号文として暗号化されます。

  • ECBモード

ECBモードの場合、ロックボックス3はISO /IEC9797-1メソッド2のパディングを使用します。ISO / IEC 9797-1メソッド2は、基本的に、値が$ 80の1バイトのパッドであり、その後に次のブロック境界に到達するために必要な数のゼロバイトが続きます。

  • ECBではありませんが、メッセージはブロック整列されています

パディングなし。特別な終了処理は必要ありません。

  • キーストリーミングモード(OFBなど)

パディングなし。終了は切り捨てによって処理されます。

  • その他(CBCなど)

パディングなし。終了は暗号文を盗むことによって処理されます。これは「学校にはクールすぎる」です。メッセージが暗号文を盗むには短すぎる場合(2ブロック未満)、メッセージは自動的にCFB-8ビットに切り替わり、キーストリーミングとして扱われます。


アップデート

警告

LockBox 3は、CSharpスタイルのユーザー管理IVおよびオールゼロパディングとの相互運用性のために設計されたことはありません。(私見、このタイプのパディングは問題があるため、避ける必要があります)。

次のコードフラグメントは、コメントで指定されたテストベクトルからのLockBox3の復号化を示しています。暗号文ストリームの前に完全なIVが付加され、暗号化コーデックが(厄介な)すべてゼロのパディングを使用していると想定されています。

procedure TForm5.Button1Click(Sender: TObject);
const
  Key: ansistring = #$33#$d4#$6c#$ff#$a1#$58#$53#$31#$94#$21#$4a#$91#$e7#$12#$fc#$2b +
                       #$45#$b5#$87#$07#$66#$75#$af#$fd#$91#$0e#$de#$ca#$5f#$41#$ac#$64;
  Reference_Plaintext: ansistring = 'a_decent_text';
  IV: ansistring = #$91#$7f#$e2#$26#$df#$83#$08#$f4#$d9#$6c#$33#$30#$47#$68#$35#$4a;
var
  Stream, ReconStream: TStream;
  Cipherb64: ansistring;
  Recon_Plaintext: ansistring;
begin
Stream := TMemoryStream.Create;
Stream.WriteBuffer( Key[1], Length( Key));
Stream.Position := 0;
CryptographicLibrary1.RegisterStreamCipher( StreamToBlock_Adapter_CSharpVariant);
Codec1.StreamCipherId := 'CSharp.StreamToBlock';
Codec1.BlockCipherId  := Format( AES_ProgId, [256]);
Codec1.InitFromStream( Stream);
Stream.Size := 0;
Stream.WriteBuffer( IV[1], Length( IV));
Cipherb64 := '+kdTGzdV5KZIw8tv466nhQ==';
Base64_to_stream( Cipherb64, Stream);
ReconStream := TMemoryStream.Create;
Stream.Position := 0;
Codec1.DecryptStream( ReconStream, Stream);
ReconStream.Position := 0;
SetLength( Recon_Plaintext, ReconStream.Size);
ReconStream.ReadBuffer( Recon_Plaintext[1], Length( Recon_Plaintext));
SetLength( Recon_Plaintext, StrLen( PAnsiChar( Recon_Plaintext)));
ReconStream.Free;
Stream.Free;
if Recon_Plaintext = Reference_Plaintext  then
    ShowMessage( 'Test passed! LockBox3 decrypts from CSharp-style zero padding.')
  else
    ShowMessage( 'Test failed!')
end;

注意すべきいくつかのポイント:

  1. おそらく設計時にフォーム上に、TCodecとTCryptographicLibrary(おそらく名前が付けられています)を事前に作成していることを前提としています。
  2. TCodecのチェーンモードおよびその他のプロパティは、設計時にすでに設定されています。テストベクトルの場合は、CBCに設定する必要があります。
  3. 指定されたストリームからブロックへのアダプタは特別なものであり、通常は暗号化ライブラリには含まれていません。これが、明示的に登録するためのコード行がある理由です。
  4. TurboPower LockBox 3 CVSリポジトリから最新のリビジョンをダウンロードするには、CVSクライアントが必要です。このアダプタはまだ公式の安定版リリースには含まれていません。
  5. このアダプタを使用すると、復号化のみが可能になります。CSharp互換の暗号化はまだ利用できません。(後でではなく早く必要な場合はお知らせください)。
  6. Delphi2007とDelphi2010でテストしました。動作します。

修正

短いメッセージの最大長、つまり、従来の暗号文ストリーミングには短すぎると見なされるプレーンテキストメッセージの最大長であるため、チェーンモードはキーストリーミングモード(CFB 8ビット)として扱われます。 1ブロック未満のバイト(前述のように「2ブロック未満」ではありません)。1.5ブロックのメッセージでも、ブロック量子化方式に暗号文の盗用を使用できます。ハーフブロックメッセージはできません。

于 2012-06-03T12:13:03.357 に答える