4

Delphi XE10 で lockbox3 を試してみます。ユーザーの入力文字列を暗号化し、検証のために値と比較したいと考えています。ただし、同じ入力文字列が異なる暗号化結果を返すたびに。私のせいは何ですか?

ここで、このエラーを発生させるサンプルコード

<UNIT CODE START>
unit Unit21;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, TPLB3.Codec, TPLB3.BaseNonVisualComponent, TPLB3.CryptographicLibrary,
  Vcl.StdCtrls;

type
  TForm21 = class(TForm)
    Button1: TButton;
    CryptographicLibrary1: TCryptographicLibrary;
    Codec1: TCodec;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form21: TForm21;

implementation

{$R *.dfm}

procedure TForm21.Button1Click(Sender: TObject);
var s0,s1 : string;
begin
    codec1.Password := 'ou[asdl[kn';
    s0 := 'asdfghjkl';
    codec1.EncryptString(s0,s1);
    label1.caption := s1;
end;

end.
<UNIT CODE END>

<FORM CODE START>

object Form21: TForm21
  Left = 0
  Top = 0
  Caption = 'Form21'
  ClientHeight = 299
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 168
    Top = 72
    Width = 31
    Height = 13
    Caption = 'Label1'
  end
  object Button1: TButton
    Left = 32
    Top = 72
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object CryptographicLibrary1: TCryptographicLibrary
    Left = 192
    Top = 136
  end
  object Codec1: TCodec
    AsymetricKeySizeInBits = 512
    AdvancedOptions2 = []
    CryptoLibrary = CryptographicLibrary1
    Left = 200
    Top = 192
    StreamCipherId = 'native.StreamToBlock'
    BlockCipherId = 'native.AES-256'
    ChainId = 'native.CBC'
  end
end
<FORM CODE END>
4

1 に答える 1

7

一見すると、AES のCBC (Cipher block chaining) モードを使用しているように見えます。

これは実際には問題ではありませんが、CBCモードが動作するように設計されている方法です。

ブロック暗号操作モードの詳細については、このウィキペディアの記事を参照してください。

暗号化における動作モードは、ブロック暗号を使用して機密性や信頼性などの情報サービスを提供するアルゴリズムです。ブロック暗号自体は、ブロックと呼ばれる 1 つの固定長のビット グループの安全な暗号化変換 (暗号化または復号化) にのみ適しています。操作モードは、暗号の単一ブロック操作を繰り返し適用して、ブロックより大きい量のデータを安全に変換する方法を説明します。

...

CBC モードでは、平文の各ブロックは、暗号化される前に前の暗号文ブロックと XOR されます。このように、各暗号文ブロックは、その時点までに処理されたすべての平文ブロックに依存します。各メッセージを一意にするには、最初のブロックで初期化ベクトルを使用する必要があります。


平文に対して常に同じ暗号文を受け取りたい場合は、代わりに基本的なECB (電子コードブック) モードに切り替えることができます (例: に変更ChainId = 'native.CBC') ChainId = 'native.ECB'

ただし、暗号文が一部の攻撃に対して脆弱になるため、これはお勧めできません。対称暗号は、同じプレーン テキストを同じキーで複数回暗号化するために使用しないでください。

そのため、チェーン操作モードが導入されました。これらは、ベースキーの代わりに使用される派生キーのシーケンスを「生成」するために使用されます (提供したキーに基づいて - あなたの場合はそれ自体がパスワードに基づいています)。

この質問も必ず読んでください。


実世界のシステム (自分以外の人が使用するシステム) を設計していて、その一部にセキュリティを提供する必要がある場合は、暗号化についてさらに学ぶことに時間を費やしてください。

はじめに、暗号に関する同様のコースを受講することをお勧めします:暗号 I (無料)

于 2016-02-07T07:46:23.483 に答える