Jim*_*pas 4 delphi cryptography aes lockbox-3
我用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>
Run Code Online (Sandbox Code Playgroud)
乍一看问题似乎是你正在使用AES的CBC(密码块链接)模式.
这实际上不是问题,但CBC模式的设计方式可行.
查看此维基百科文章,了解有关分组密码操作模式的更多详细信息
在密码术中,操作模式是使用分组密码来提供诸如机密性或真实性的信息服务的算法.块密码本身仅适用于称为块的一个固定长度的比特组的安全加密变换(加密或解密).操作模式描述了如何重复应用密码的单块操作以安全地变换大于块的数据量.
...
在CBC模式中,每个明文块在加密之前与先前的密文块进行异或.这样,每个密文块取决于直到该点处理的所有明文块.要使每条消息唯一,必须在第一个块中使用初始化向量.
如果您希望始终为某些纯文本接收相同的密文,则可以切换到基本的ECB(电子密码本)模式(例如,更改ChainId = 'native.CBC'为ChainId = 'native.ECB').
但不建议这样做,因为它会使您的密文易受某些攻击.不应使用对称密码多次使用相同的密钥加密相同的纯文本.
这就是为什么引入链接操作模式的原因.它们用于"生成"一系列派生密钥(基于您提供的密钥 - 在您的情况下基于密码),而不是基本密钥.
一定要阅读这个问题:
如果您正在设计一个真实世界的系统(将由除您自己以外的其他人使用),并且您需要为其中的任何部分提供安全性,请花一些时间来了解有关加密的更多信息.
| 归档时间: |
|
| 查看次数: |
1090 次 |
| 最近记录: |