锁箱3加密字符串:相同的字符串会给出不同的加密结果。

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>

加密确实需要您具备基本的理解,否则您很可能会编写不安全的代码。 - David Heffernan
1个回答

7
乍一看,问题似乎是您正在使用AES的CBC(密码块链接)模式。
实际上,这不是问题,而是CBC模式设计工作的方式。
请查看此维基百科文章以获取有关块密码操作模式的更多详细信息。
在密码学中,操作模式是一种算法,它使用块密码提供信息服务,例如机密性或真实性。单独的块密码仅适用于安全的加密或解密一个称为块的固定长度位组的密码转换。操作模式描述如何重复应用密码的单个块操作以安全地转换大于块的数据量。
在CBC模式中,每个明文块在加密之前与前一个密文块进行XOR运算。这样,每个密文块都取决于到该点为止处理的所有明文块。为使每个消息唯一,必须在第一个块中使用初始化向量。
如果您希望始终为某些明文接收相同的密文,可以切换到基本的ECB(电子密码本)模式(例如,将ChainId = 'native.CBC'更改为ChainId = 'native.ECB')。但这并不推荐,因为它使您的密文容易受到某些攻击。对称密码不应用于使用相同密钥加密相同明文超过一次的情况。这就是引入操作链模式的原因。它们用于“生成”一系列派生密钥(基于您提供的密钥 - 在您的情况下,它本身基于密码),这些密钥代替基本密钥。确保还阅读这个问题:
如果您正在设计一个真实世界的系统(将被其他人使用),并且需要为其中任何部分提供安全性,请花些时间学习更多有关密码学的知识。一个很好的开始是参加类似的密码学课程:密码学 I(免费)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接