DEC加密在每个程序启动后创建相同的结果

时间:2014-06-05 20:20:29

标签: delphi encryption delphi-xe2

在Delphi XE2中使用DEC(Delphi Encryption Compendium Version 5.2),我使用以下代码加密字符串。
但是,在每个程序启动之后,会生成相同的加密结果序列。我曾尝试在Randomize中使用FormCreate,但这没有帮助。

uses
  DECUtil, DECCipher, DECHash, DECFmt;

const
  MyPW = 'MyPassword';

var
  AKDFIndex: LongWord = 1;

function MyEncryptEx(const AText: string;
                     const APassword: string;
                     ATextFormat: TDECFormatClass;
                     AHashClass: TDECHashClass;
                     ACipherMode: TCipherMode;
                     ACipherClass: TDECCipherClass): string;
var
  ASalt: Binary;
  AData: Binary;
  APass: Binary;
begin
  with ValidCipher(ACipherClass).Create, Context do
    try
      ASalt := RandomBinary(16);
      APass := ValidHash(AHashClass).KDFx(APassword[1], length(APassword) * SizeOf(APassword[1]),
               ASalt[1], length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
      Mode := ACipherMode;
      Init(APass);
      SetLength(AData, length(AText) * SizeOf(AText[1]));
      Encode(AText[1], AData[1], length(AData));
      Result := ValidFormat(ATextFormat).Encode(ASalt + AData + CalcMAC);          
    finally
      Free;
      ProtectBinary(ASalt);
      ProtectBinary(AData);
      ProtectBinary(APass);
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;

procedure TForm1.btnTestClick(Sender: TObject);
var
  EncrText: string;
begin
  EncrText := MyEncryptEx(edtHWID.Text, MyPW, TFormat_ESCAPE, THash_Whirlpool, cmCBCx, TCipher_Rijndael); 
end;

程序启动后似乎没有初始化一些Randomizer。 那么如何在每个程序启动后获得不同的加密结果呢?

1 个答案:

答案 0 :(得分:2)

我找到了some source code。看起来DECUtil的RandomBinary使用自己的种子。您可以尝试拨打RandomSeed(RandomSystemTime, 4)而不是Randomize