【问题标题】:Lockbox3 encryptstring : same string gives different encrypted resultLockbox3 encryptstring:相同的字符串给出不同的加密结果
【发布时间】:2016-02-07 04:12:00
【问题描述】:

我尝试使用 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>

【问题讨论】:

  • 加密确实需要你有一个基本的了解。否则,您可能会生成不安全的代码。

标签: delphi cryptography aes lockbox-3


【解决方案1】:

乍一看,问题似乎是您使用的是 AES 的 CBC(密码块链接)模式。

这实际上不是问题,但 CBC 模式的工作方式已经设计好了。

查看这篇维基百科文章了解更多关于Block cipher mode of operation的详细信息

在密码学中,操作模式是一种使用块的算法 密码以提供信息服务,例如机密性或 真实性。分组密码本身仅适用于安全 一个的加密转换(加密或解密) 固定长度的一组比特称为一个块。一种操作方式 描述了如何将密码的单块操作重复应用于 安全地转换大于块的数据量。

...

在CBC模式下,每个明文块都与前一个块进行异或 加密前的密文块。这样,每个密文 块取决于到该点处理的所有明文块。到 使每条消息唯一,必须在 第一个区块。


如果您希望某些纯文本始终收到相同的密文,您可以切换到基本 ECB (Electronic Codebook) 模式(例如,将 ChainId = 'native.CBC' 更改为 ChainId = 'native.ECB' )。

但不建议这样做,因为它会使您的密文容易受到某些攻击。对称密码不应用于多次使用相同的密钥加密相同的纯文本。

这就是引入链接操作模式的原因。它们用于“生成”一系列派生密钥(基于您提供的密钥 - 在您的情况下,它本身基于密码),用于代替基本密钥。

请务必阅读此问题:


如果您正在设计一个真实世界的系统(将由其他人而不是您自己使用),并且您需要为其任何部分提供安全性,请花一些时间来学习更多关于密码学的知识。

学习类似的密码学课程是一个好的开始:Cryptography I(免费)

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2020-03-12
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多