⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testunit.pas

📁 AES加密解密程序(开发语言delphi)
💻 PAS
字号:
unit TestUnit;

interface
  function compareTwoKey (Key1:String; Key2:String; KeyLen : integer) : Boolean;
  function createKeyWord (TempString : String; TempChange : String) : String;
  function TestUseKeyWord (KeyLicence:String; AllotLicence:String; MeterID:String; KeyWord : String; changeArea : integer) : boolean;
  function TestUseMeterID (KeyLicence:String; AllotLicence:String; MeterID:String; KeyWord : String; changeArea : integer) : boolean;
  function TestDynamicKeyUseNumber ( MeterID:String; Key:String ) : Boolean;
  function TestHashAndPlaintext ( Plaintext : String; LenPlaintext : integer; LenArea : integer) : Boolean;
  function testBestRounds (Plaintext : String; Key : String; Rounds : integer; Times : integer ) : Boolean;
  function  PlaintextAffectEncryption ( Plaintext : String; Key : String; Rounds : integer; Times : integer ) : Boolean;
  function  KeyAffectEncryption ( Plaintext : String; Key : String; Rounds : integer; Times : integer ) : Boolean;
  function testBestRoundsForDecoding (Plaintext : String; Key : String; Rounds : integer; Times : integer ) : Boolean;


implementation
Uses
  SysUtils, StrUtils, aesUnit;

//所有的测试程序的函数
function compareTwoKey (Key1:String; Key2:String; KeyLen : integer) : Boolean;
//比较两个Key是否相同
var
  //result:boolean;
  i:integer;
begin
  for i := 1 To KeyLen do
    if (Key1[i] <> Key2[i]) then
    begin
      compareTwoKey := False;
      exit;
    end;
  compareTwoKey := True;
end;


function createKeyWord (TempString : String; TempChange : String) : String;
//产生KeyWord
var
  i : integer;
  carry, Temp : integer;
  finalString : String;
begin
  carry := 0;
  finalString := '';
  i := 1;
  while True do
  begin
    if ((i > Length(TempString)) and (carry = 0) ) then break;
    if (i <= length(TempChange)) then
      begin
      Temp := StrToInt(TempString[length(TempString) - i + 1]) + StrToInt(TempChange[length(TempChange) - i + 1]) + carry;
      carry := Temp div 10;
      Temp := Temp mod 10;
      finalString := finalString + IntToStr(Temp);
      end;
    if ((i > length(TempChange)) and (i <= Length(TempString))) then
      begin
        Temp := StrToInt(TempString[length(TempString) - i + 1]) + carry;
        carry := Temp div 10;
        Temp := Temp mod 10;
        finalString := finalString + IntToStr(Temp);
      end;
    if (i > Length (TempString) ) then
    begin
      finalString := finalString + IntToStr(carry);
      carry := 0;
    end;
    i := i+1;
  end;
  createKeyWord := ReverseString(finalString);
end;

function TestUseKeyWord (KeyLicence:String; AllotLicence:String; MeterID:String; KeyWord : String; changeArea : integer) : boolean;
//测试密钥分配方案中KeyWord 对 Key 的影响
var
  i, j : integer;
  Key : array[1..100000] of String;
  Number : array[1..100000] of integer;
  F : TextFile;
begin
  for i := 1 To changeArea do
    Number[i] := 0;
  for i := 1 To changeArea do
  begin
    KeyWord := createKeyWord (KeyWord, '1');
    Key[i] :=  KeyDistribution (KeyLicence, AllotLicence, MeterID, KeyWord);
  end;
  for i := 1 To changeArea-1 do
    for j := i+1 To changeArea do
    begin
      if (Key[i]=Key[j]) then
      begin
        Number[i] := Number[i] + 1;
//      showmessage('key['+IntToStr(i)+']='+key[i]+'key['+IntToStr(j)+']='+key[j]);
//      if (compareTwoKey(Key[i], Key[j], 32)) then Number[i] := Number[i] + 1;
      end;
    end;
  AssignFile (F, 'TestKeyWordToKey.txt');
  Rewrite (F);
  writeln(F, 'KeyLicence = ' + KeyLicence);
  writeln (F, 'AllotLicence = '+ AllotLicence);
  TestUseKeyWord := True;
  for i := 1 To changeArea do
    if (Number[i] > 0) then
    begin
      TestUseKeyWord := false;
      writeln (F, Key[i] + '相同的次数' + IntToStr(Number[i]));
    end;
  closeFile (F);

end;

function TestUseMeterID (KeyLicence:String; AllotLicence:String; MeterID:String; KeyWord : String; changeArea : integer) : boolean;
//测试Key随MeterID变化的情况
var
  i, j : integer;
  Key : array[1..100000] of String;
  Number : array[1..100000] of integer;
  F : TextFile;
begin
  for i := 1 To changeArea do
    Number[i] := 0;
  for i := 1 To changeArea do
  begin
    MeterID := createKeyWord (MeterID, '1');
    Key[i] :=  KeyDistribution (KeyLicence, AllotLicence, MeterID, KeyWord);
  end;
  for i := 1 To changeArea-1 do
    for j := i+1 To changeArea do
    begin
      if (compareTwoKey(Key[i], Key[j], 32)) then Number[i] := Number[i] + 1;
    end;
  AssignFile (F, 'TestMeterIDToKey.txt');
  Rewrite (F);
  TestUseMeterID := True;
  for i := 1 To changeArea do
    if (Number[i] > 0) then
    begin
      TestUseMeterID := false;
      writeln (F, Key[i] + '相同的次数' + IntToStr(Number[i]));
    end;
  closeFile (F);
end;

function TestDynamicKeyUseNumber ( MeterID:String; Key:String ) : Boolean;
var
  Number : integer;
  Dkey : array[1..100000] of String;
  i,j : integer;
  time : array[1..100000] of integer;
  F : TextFile;
begin
  Number := 0;
  for i := 1 To 100000 do
  begin
    time[i] := 0;
    Dkey[i] := DynamicKey (MeterID, Key, Number);
    Number := Number + 1;
  end;
  for i := 1 To 99999 do
    for j := i+1 To 100000 do
    begin
      if (Dkey[i]=Dkey[j]) then time[i] := time[i] + 1;
    end;
  AssignFile (F, 'TestDynamicKeyUseNumber.txt');
  Rewrite (F);
  TestDynamicKeyUseNumber := True;
  for i := 1 To 10000 do
  begin
    if (time[i] > 0) then
      begin
       writeln (F, Dkey[i] + '出现相同次数' + IntToStr (time[i]));
       TestDynamicKeyUseNumber := false;
      end;
  end;
  closeFile (F);
end;

function TestHashAndPlaintext ( Plaintext : String; LenPlaintext : integer; LenArea : integer) : Boolean;
//测试Hash函数对明文的影响。
var
  LowPlaintext, HighPlaintext : String;
  i : integer;
  InvHashPlaintext, originPlaintext : String;
  F : TextFile;
begin
  If ((LenPlaintext = 12) or (LenPlaintext = 16)) Then
  Begin
  LowPlaintext := Copy (Plaintext, LenPlaintext div 2+1, LenPlaintext div 2);
  HighPlaintext := Copy (Plaintext, 1, LenPlaintext div 2);
  AssignFile (F, '长度' +IntToStr (LenPlaintext) + 'TestHash.txt');
  Rewrite (F);
  originPlaintext := InAes (HighPlaintext, LowPlaintext, 2);
  for i := 1 To LenArea do
  begin
    LowPlaintext := createKeyWord (LowPlaintext, '1');
    InvHashPlaintext := InAes (HighPlaintext, LowPlaintext, 2);
    if (compareTwoKey (originPlaintext, InvHashPlaintext, LenPlaintext)) then
      writeln (F, LowPlaintext);
  end;
  closeFile (F);
  End;
  If (LenPlaintext = 20) Then
  Begin
    AssignFile (F, '长度' + IntToStr (LenPlaintext) + 'TestHash.txt');
    Rewrite (F);
    originPlaintext := InAES (Copy(Plaintext,1,8), Copy(Plaintext, 9, 12),2);
    TestHashAndPlaintext := True;
    For i := 1 To LenArea Do
    Begin
      Plaintext := createKeyWord (Plaintext, '1');
      InvHashPlaintext := InAES (Copy(Plaintext,1,8), Copy(Plaintext, 9, 12),2);
      IF (InvHashPlaintext = originPlaintext) Then
      Begin
        TestHashAndPlaintext := False;
        writeln (F, Plaintext);
      End;
    End;
    closeFile (F);
  End;

end;

function testBestRounds (Plaintext : String; Key : String; Rounds : integer; Times : integer ) : Boolean;
//测试扩散率。但是要求的测试不同的东西。我只好在写一个函数。
var
  Encryption, TempPlaintext, TempKey : String;
  i,j,k : integer;
  F : TextFile;
  SameTimes : integer;
  TResult : Extended;
begin
  AssignFile (F, 'Diffusion Rate of Plaintext' + IntToStr(Length(Plaintext)) +'.txt');
  Rewrite (F);
  writeln (F, 'The Plaintext is ' + Plaintext);
  writeln (F, 'The Key is ' + Key);
  //明文改变
  for i := 2 To Rounds do
  begin
    SameTimes := 0;
    TempPlaintext := Plaintext;
    for j := 1 To Times do
    begin
      Encryption := AES (TempPlaintext, Key, i);
      for k := 1 To Length (TempPlaintext) do
      begin
        if (Encryption[k] = TempPlaintext [k]) then SameTimes := SameTimes + 1;
      end;
      TempPlaintext := createKeyWord (TempPlaintext, '1');
    end;
    TResult := 1 - SameTimes / (Length (Plaintext)* Times );
    writeln (F, 'Round:' + IntToStr(i) + '$$ the diffusivity is ' + FloatToStr(TResult));
  end;
  writeln (F, 'Change Key');
  writeln (F, '**********************************************');
  //密钥改变
  for i := 2 To Rounds do
  begin
    SameTimes := 0;
    TempKey := Key;
    for j := 1 To Times do
    begin
      Encryption := AES (Plaintext, TempKey, i);
      for k := 1 To Length (Plaintext) do
      begin
        if (Encryption[k] = Plaintext [k]) then SameTimes := SameTimes + 1;
      end;
      TempKey := createKeyWord (TempKey, '1');
    end;
    TResult := 1 - SameTimes / (Length (Plaintext)* Times );
    writeln (F, 'Round:' + IntToStr(i) + '$$ the diffusivity is ' + FloatToStr(TResult));
  end;
  closeFile (F);
  testBestRounds := True;
end;

function  PlaintextAffectEncryption ( Plaintext : String; Key : String; Rounds : integer; Times : integer ) : Boolean;
//明文变化对密文的影响
var
  Encryption1, Encryption2, TempPlaintext : String;
  i,j,k : integer;
  F : TextFile;
  SameTimes : integer;
  TResult : Extended;
begin
  AssignFile (F, 'Plaintext affect the Encryption' + IntToStr(Length(Plaintext)) +'.txt');
  Rewrite (F);
  writeln (F, 'The Plaintext is ' + Plaintext);
  writeln (F, 'The Key is ' + Key);
  for i := 2 To Rounds do
  begin
    SameTimes := 0;
    TempPlaintext := Plaintext;
    Encryption1 := AES (TempPlaintext, Key, i);
    TempPlaintext := createKeyWord (TempPlaintext, '1');
    for j := 1 To Times-1 do
    begin
      Encryption2 := AES (TempPlaintext, Key, i);
      for k := 1 To Length (TempPlaintext) do
      begin
        if (Encryption1[k] = Encryption2[k]) then SameTimes := SameTimes + 1;
      end;
      TempPlaintext := createKeyWord (TempPlaintext, '1');
      Encryption1 := Encryption2;
    end;
    TResult := 1 - SameTimes / (Length (Plaintext)* Times );
    writeln (F, 'Round:' + IntToStr(i) + '$$ the diffusivity is ' + FloatToStr(TResult));
  end;
  closeFile (F);
  PlaintextAffectEncryption := True;
end;

function  KeyAffectEncryption ( Plaintext : String; Key : String; Rounds : integer; Times : integer ) : Boolean;
//密钥变化对密文的影响
var
  Encryption1, Encryption2 : String; //, TempPlaintext
  i,j,k : integer;
  F : TextFile;
  SameTimes : integer;
  TResult : Extended;
begin
  AssignFile (F, 'Key affect the Encryption' + IntToStr(Length(Plaintext)) +'.txt');
  Rewrite (F);
  writeln (F, 'The Plaintext is ' + Plaintext);
  writeln (F, 'The Key is ' + Key);
  for i := 2 To Rounds do
  begin
    SameTimes := 0;
    Encryption1 := AES (Plaintext, Key, i);
    Key := createKeyWord (Key, '1');
    for j := 1 To Times-1 do
    begin
      Encryption2 := AES (Plaintext, Key, i);
      for k := 1 To Length (Plaintext) do
      begin
        if (Encryption1[k] = Encryption2[k]) then SameTimes := SameTimes + 1;
      end;
      Key := createKeyWord (Key, '1');
      Encryption1 := Encryption2;
    end;
    TResult := 1 - SameTimes / (Length (Plaintext)* Times );
    writeln (F, 'Round:' + IntToStr(i) + '$$ the diffusivity is ' + FloatToStr(TResult));
  end;
  closeFile (F);
  KeyAffectEncryption := True;
end;
//TestBestRounds for Decoding
function testBestRoundsForDecoding (Plaintext : String; Key : String; Rounds : integer; Times : integer ) : Boolean;
var
  Proclaiming, TempEncryption, TempKey : String;
  i,j,k : integer;
  F : TextFile;
  SameTimes : integer;
  TResult : Extended;
begin
  AssignFile (F, 'Encryption affect Plaintext' + IntToStr(Length(Plaintext)) + 'Decoding' +'.txt');
  Rewrite (F);

  //明文改变
  for i := 2 To Rounds do
  begin
    SameTimes := 0;
    //TempEncryption := Encryption;
    TempEncryption := AES (Plaintext, Key, i);
    writeln (F, 'Rounds is ' + IntToStr (i));
    writeln (F, 'The Encryption is ' + TempEncryption);
    writeln (F, 'The Key is ' + Key);
    for j := 1 To Times do
    begin
      TempEncryption := createKeyWord (TempEncryption, '1');
      Proclaiming := InAES (TempEncryption, Key, i);
      for k := 1 To Length (TempEncryption) do
      begin
        if (Proclaiming[k] = Plaintext [k]) then SameTimes := SameTimes + 1;
      end;

    end;
    SameTimes := SameTimes - Length(Proclaiming);
    TResult := 1 - SameTimes / (Length (Proclaiming)* Times );
    writeln (F, 'Round:' + IntToStr(i) + '$$ the diffusivity is ' + FloatToStr(TResult));
  end;
  writeln (F, 'Change Key');
  writeln (F, '**********************************************');
  //密钥改变
  for i := 2 To Rounds do
  begin
    SameTimes := 0;
    TempKey := Key;
    TempEncryption := AES (Plaintext, Key, i);
    writeln (F, 'Rounds is ' + IntToStr (i));
    writeln (F, 'The Encryption is ' + TempEncryption);
    writeln (F, 'The Key is ' + Key);
    for j := 1 To Times do
    begin
      TempKey := createKeyWord (TempKey, '1');
      Proclaiming := InAES (TempEncryption, TempKey, i);
      for k := 1 To Length (Proclaiming) do
      begin
        if (Plaintext[k] = Proclaiming [k]) then SameTimes := SameTimes + 1;
      end;

    end;
    SameTimes := SameTimes - Length(Proclaiming);
    TResult := 1 - SameTimes / (Length (Proclaiming)* Times );
    writeln (F, 'Round:' + IntToStr(i) + '$$ the diffusivity is ' + FloatToStr(TResult));
  end;

  closeFile (F);
  testBestRoundsForDecoding := True;
end;
end.
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -