📄 testunit.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 + -