📄 aesu.pas
字号:
for j:=0 to (len div n1)-1 do
begin
k:=((j-i) mod (len div n1));
if k<0 then k:=k+(len div n1);
temp[j]:=Matrix[i,k];
end;
for j:=0 to (len div n1)-1 do Matrix[i,j]:=temp[j];
end;
//*最后将移位后数据复制回去原数组*/
st:='';
for i:=0 to len-1 do
begin
j:=i mod n1;
k:=i div n1;
st:=st + Matrix[j,k];
end;
InShiftRow:=st;
end;
//列混合的逆InMixClumn(status,len)
function InMixClumn(status:string):string;
var
i,j,k,n1,n2:integer;
Matrix:array[0..3,0..7] of integer;
st:string;
begin
if length(status)=6 then n1:=3 else n1:=4;
n2:=length(status) div n1;
for i:=0 to n1*n2-1 do
begin
k:=i div n1 ;
j:=i mod n1;
Matrix[j,k]:=StrToInt(status[i+1]);
end;
//*明文为8(Hash函数)、12、16位十进制数的4维列混合处理*/
st:='';
if n1=4 then
for i:=0 to n2-1 do
begin
St:=st+IntToStr((5* Matrix [0,i] + 9* Matrix [1,i] + 4* Matrix [2,i] + 3*Matrix [3,i]) mod 10);
St:=st+IntToStr(( 3*Matrix [0,i] + 5* Matrix [1,i] + 9* Matrix [2,i] + 4* Matrix [3,i]) mod 10);
St:=st+IntToStr((4* Matrix [0,i] + 3*Matrix [1,i] + 5* Matrix [2,i] + 9* Matrix [3,i]) mod 10);
St:=st+IntToStr((9* Matrix [0,i] + 4* Matrix [1,i] + 3*Matrix [2,i] + 5* Matrix [3,i]) mod 10);
end;
//*明文为6位十进制数(Hash函数)的3维列混合处理*/
if n1=3 then
for i:=0 to n2-1 do
begin
St:=st+IntToStr(( Matrix [0,i] + 2* Matrix [1,i] + 8* Matrix [2,i]) mod 10);
St:=st+IntToStr((8* Matrix [0,i] + Matrix [1,i] + 2* Matrix [2,i]) mod 10);
St:=st+IntToStr((2* Matrix [0,i] + 8* Matrix [1,i] + Matrix [2,i]) mod 10);
end;
InMixClumn:=st;
end;
//轮密钥加的逆InAddRoundKey
function InAddRoundKey (Status:String; bKey:String; time:integer) : String;
var
TempString : String;
addressBegin,enter : integer;
i, j,len, temp : integer;
begin
len:=length(status);
addressBegin := len * time;
enter := 0;
for i := addressBegin to addressBegin+len-1 do enter := enter + StrToInt(bKey[i+1]);
enter := enter mod 4;
TempString := '';
for i := 0 to len-1 do
begin
j := (i + enter) mod 4;
if j = 0 then
begin
temp:=(StrToInt( Status[i+1] ) - StrToInt( bKey[i+addressBegin+1] ) ) mod 10;
if temp<0 then temp:=temp+10;
TempString := TempString + InttoStr(temp);
end;
if j = 1 then TempString := TempString + InttoStr( (StrToInt( Status[i+1] ) + StrToInt(bKey[i+addressBegin+1])) mod 10 );
if j = 2 then
begin
temp:=(StrToInt( Status[i+1] ) - Box[ StrToInt(bKey[i+addressBegin+1]) ]) mod 10;
if temp<0 then temp:=temp+10;
TempString := TempString + InttoStr(temp);
end;
if j = 3 then TempString := TempString + InttoStr( (StrToInt( Status[i+1] ) + Box[ StrToInt(bKey[i+addressBegin+1]) ]) mod 10 );
end;
InAddRoundkey := TempString;
end;
//AES解密
function INAES(status:string;key:string;time:integer):String;
var
ij,n1,n2,len:integer;
begin
len:=length(status);
// lenk:=length(key);
if (len=6) then n1:=3 else n1:=4;
n2:=len div n1;
if (len<>n1*n2) then exit;
//*对明文为12、16、20的十进制数解密*/
if ((len=12) or (len=16) or (len=20)) then
begin
key:=EK(key, time, len); //密钥扩展,一次性扩展
status:=InAddRoundKey(status,key,time); //初始轮密钥加
status:=InShiftRow(status,time);
status:=InS_box(status); //最后一轮加密
for ij:=time-1 downto 1 do
begin
status:=InAddRoundKey(status,key,ij);
status:=InMixClumn(status);
status:=InShiftRow(status,ij);
status:=InS_box(status);
end;
status:=InAddRoundKey(status,key,0);
end;
//*对Hash函数的加密和对32位长度的十进制数2轮AES解密*/
if ((len=6) or (len=8) or (len=32)) then
begin
key:=EK(key,2,len);
status:=InAddRoundKey(status,key,2);
status:=InShiftRow(status,2);
status:=InS_box(status);
status:=InAddRoundKey(status,key,1);
status:=InMixClumn(status);
status:=InShiftRow(status,1);
status:=InS_box(status);
status:=InAddRoundKey(status,key,0);
end;
INAES:=status;
end;
//密钥分配种子的扩展,Kw的扩展算法
function ExtendsKW (KeyWord:String; MeterID:String) : String;
var
surplus : integer; //要补的位数
Matrix_n : integer; //现有的矩阵的列数
i, j, k,temp: integer;
TempKeyWord : String;
begin
if Length(KeyWord) > 32 then
begin
ExtendsKW := Copy (KeyWord, 1, 32);
exit;
end;
if Length(KeyWord) < 8 then
begin
temp := 0;
For i := 1 To Length(KeyWord) Do
temp := temp + StrToInt(KeyWord[i]);
temp := temp mod 10;
//补完位了以后对于TempKeyWord中的一部分进行替换
If (Length(KeyWord) = 7) Then
TempKeyWord := KeyWord + IntToStr (Box[ temp ])
Else
begin
TempKeyWord := KeyWord + Copy (MeterID, 32-(8-Length(KeyWord))+1, 8-Length(KeyWord));
TempKeyWord[ Length(KeyWord)+1 ] := char (48 + Box[ temp ]);
TempKeyWord[ Length(KeyWord)+2 ] := char (48 + 9 - InBox[ temp ]);
end;
end;
If (Length(KeyWord) = 8) Then TempKeyWord := KeyWord;
If ((length(KeyWord) > 8) and (length(KeyWord) < 32)) Then
begin
surplus := length(KeyWord) mod 4;
TempKeyWord := KeyWord + Copy (MeterID, 32-(4-surplus)+1, 4-surplus);
end;
//下面是把TempKeyWord扩展到32位
Matrix_n := length(TempKeyWord) div 4;
j := 0;
for i := 8 - Matrix_n DownTo 1 do
begin
TempKeyWord := TempKeyWord + IntToStr((StrToInt( TempKeyWord[j*4+1]) + Box[ StrToInt( TempKeyWord[ j*4+(Matrix_n-1)*4 +1 ] ) ] ) mod 10 );
for k := 2 To 4 do
TempKeyWord := TempKeyWord + IntToStr((StrToInt(TempKeyWord[j*4 + k]) + StrToInt(TempKeyWord [j*4+k+(Matrix_n-1)*4])) mod 10);
j := j + 1;
end;
ExtendsKW := TempKeyWord;
end;
//密钥的分配算法
function KeyDistribution (KeyLicence:String; AllotLicence:String; MeterID:String; KeyWord:String) : String;
var
Beginning : integer;
i, k,ke,temp : integer;
KW, Key : String;
initbegin : integer;
begin
// len := Length(AllotLicence);
if Length(KeyWord) < 3 then
initbegin := StrToInt (KeyWord)
else
initbegin := StrToInt (Copy(KeyWord, 1, 3));
initbegin := initbegin mod 255;
Beginning := (StrToInt(AllotLicence[(initbegin+2) mod 255 + 1]) + StrToInt(AllotLicence[(initbegin+1) mod 255 + 1])*10 + StrToInt(AllotLicence[initbegin])* 100) mod 255 +1;
k := (StrToInt(KeyWord[Length(KeyWord)]) mod 2) + (Beginning mod 2)*2;
KW := ExtendsKW (KeyWord, MeterID);
initbegin := (StrToInt(AllotLicence[(Beginning+2) mod 255 +1]) + StrToInt(AllotLicence[(Beginning+1) mod 255 +1])*10 + StrToInt(AllotLicence[Beginning])* 100) mod 255+1;
Key := '';
for i := 0 To 31 do
begin
Beginning := (Beginning + StrToInt(MeterID[i+1])) mod 255+1;
Ke := StrToInt(KeyLicence[ (initbegin + StrToInt(AllotLicence[Beginning])) mod 255+1 ]);
k := k mod 4;
if (k=0) then Key := Key + IntToStr ((Ke + StrToInt(KW[i+1])) mod 10);
if (k=1) then
begin
temp := (Ke - StrToInt(KW[i+1])) mod 10;
if temp < 0 then temp := 10 + temp;
Key := Key + InttoStr( temp );
end;
if (k=2) then Key := Key + IntToStr ( (Ke + Box[StrToInt(KW[i+1])] ) mod 10);
if (k=3) then
begin
temp := (Ke - Box[StrToInt(KW[i+1])]) mod 10;
if temp < 0 then temp := 10 + temp;
Key := Key + IntToStr(temp);
end;
k := k + 1;
end;
KeyDistribution:=AES(meterID,key,2);
end;
//动态密钥的计算
function DynamicKey (MeterID:String; Key:String; Number:integer) : String;
var
i, k, temp : integer;
DKey : String;
Num : array[0..3] of integer;
begin
DKey := '';
for i := 0 To 3 do
begin
temp := Number mod 10;
Num[i] := temp;
Number := Number div 10;
end;
k := Num[0] mod 4;
for i := 1 To 32 do
begin
if (k=0) then DKey := DKey + IntToStr( (StrToInt(Key[i])+ (StrToInt(MeterID[i])+ Num[i mod 4]) mod 10 ) mod 10 );
if (k=1) then
begin
temp := (StrToInt(Key[I])- ((StrToInt(MeterID[I]) -Num[i mod 4]) mod 10)) mod 10;
if temp < 0 then temp := temp + 10;
temp := temp mod 10;
DKey := DKey + IntToStr(temp);
end;
if (k=2) then DKey := DKey + IntToStr((StrToInt(Key[I])+ Box[(StrToInt(MeterID[I]) +Num[i mod 4]) mod 10]) mod 10);
if (k=3) then
begin
temp := (StrToInt(Key[I])- Box[(StrToInt(MeterID[I]) -Num[i mod 4]) mod 10]) mod 10;
if temp < 0 then temp := temp + 10;
temp := temp mod 10;
DKey := DKey + IntToStr(temp);
end;
k := (k + 1) mod 4;
end;
DynamicKey := AES(MeterID, DKey, 2);
end;
//仿真程序各按钮程序
//
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
ss:string;
begin
ss:='';
// k:=Random(100000000);
ss:=ss+IntToStr(Random(100000000));
for i:=0 to 6
do ss:=ss+IntToStr(Random(100000000));
Edit2.Text:=copy(ss,1,32);
Edit10.Text:=Edit2.Text;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
l1:integer;
// st1,st2,st3:string;
begin
l1:=StrToInt(Edit6.Text);
if ((l1=12) or (l1=16) or (l1=20)) then
begin
Edit3.Text := aes(copy(Edit5.Text, 1,l1), copy(Edit2.Text,1,32), StrToInt(Edit7.text)); //Rounds(Edit1.Text, 12, Edit3.Text,0);
Edit9.Text:=Edit3.Text;
end;
if l1=32 then
begin
Edit3.Text := aes(copy(Edit1.Text,1,32),copy(Edit2.Text,1,l1),2);
Edit9.Text:=Edit3.Text;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
l1,l2:integer;
begin
l1:=StrToInt(Edit6.Text);
if l1=12 then
begin
l2:=l1-6;
Edit5.Text:=AES(Copy(Edit1.Text,1,6),Copy(Edit1.Text,7,6),2)+copy(Edit1.Text,7,l2);
end
else if ((l1=16) or (l1=20)) then
begin
l2:=l1-8;
Edit5.Text:=AES(Copy(Edit1.Text,1,8),Copy(Edit1.Text,9,l2),2)+copy(Edit1.Text,9,l2);
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Edit4.Text:=InAES(copy(Edit9.Text,1,StrToInt(Edit11.text)), copy(Edit10.Text,1,32), StrToInt(Edit12.text));
end;
procedure TForm1.Button5Click(Sender: TObject);
var
l1,l2:integer;
begin
l1:=StrToInt(Edit11.Text);
if l1=12 then
begin
l2:=l1-6;
Edit8.Text:=InAES(Copy(Edit4.Text,1,6),Copy(Edit4.Text,7,l2),2)+copy(Edit4.Text,7,l2);
end;
if ((l1=16) or (l1=20)) then
begin
l2:=l1-8;
Edit8.Text:=InAES(Copy(Edit4.Text,1,8),Copy(Edit4.Text,9,l2),2)+copy(Edit4.Text,9,l2);
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Edit14.Text := KeyDistribution (PKeyLicence, PAllotLicence, Edit13.Text, Edit17.Text);
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var
Number : integer;
begin
if copy(Edit14.Text,1,1)='E' then begin ShowMessage('未分配电表密钥!请先分配电表密钥!'); exit; end;
Number := StrToInt(Edit15.Text);
Edit16.Text := DynamicKey (Edit13.Text, Edit14.Text, Number);
Edit2.Text:=Edit16.Text;
edit10.Text:=Edit2.Text;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
var
len : integer;
begin
Random (StrToInt(copy(Edit17.Text,1,10)));
PKeyLicence := '';
for len := 1 To 255 do
begin
PKeyLicence := PKeyLicence + IntToStr(Random (10));
end;
for len := 1 To 255 do
PAllotLicence := PAllotLicence + IntToStr(Random(10));
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
Edit14.Text := ExtendsKW (Edit17.Text, Edit13.Text);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -