📄 aesunit.pas
字号:
//*对明文长度为6、8十进制数时第2列循环处理*/
if (len=6) or (len=8) then
begin
for i:=0 to n1-1 do
begin
k:=(i-1) mod n1;
if k<0 then k:=k+ n1;
Temp[i]:=Matrix[k,1];
end;
for i:=0 to n1-1 do
Matrix[i,1] := Temp[i];
end;
//AES的行移位的逆
for i:=1 to n1-1 do
begin
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=10) 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;
//*****2004
// if ((keyword=Form1.Edit17.Text) or (keyword=IntToStr(StrToInt(Form1.Edit17.Text)+1000))) then showmessage('keyword='+keyword+'TempKeyWord='+TempKeyWord);
//下面是把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 ] )+i mod 10] ) mod 10 );
for k := 2 To 4 do
TempKeyWord := TempKeyWord + IntToStr((StrToInt(TempKeyWord[j*4 + k]) + StrToInt(TempKeyWord [j*4+k-1+(Matrix_n-1)*4])) mod 10);
j := j + 1;
end;
ExtendsKW := TempKeyWord;
// showmessage(EK(TempKeyWord,4,8));
// ExtendsKW :=EK(TempKeyWord,4,8);
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) < 4 then
initbegin := StrToInt (KeyWord)
else
initbegin := StrToInt (Copy(KeyWord, Length(KeyWord)-3, Length(KeyWord)));
initbegin := initbegin mod 255 + 1;
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);
// showMessage ('KW = ' + KW);
//**2004
// if keyword=Form1.Edit17.Text then showmessage(KW);
// if keyword=IntToStr(StrToInt(Form1.Edit17.Text)+1000) then showmessage(KW);
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..4] of integer;
begin
DKey := '';
for i := 0 To 4 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 5]) mod 10 ) mod 10 );
if (k=1) then
begin
temp := (StrToInt(Key[I])- ((StrToInt(MeterID[I]) -Num[i mod 5]) 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 5]) mod 10]) mod 10);
if (k=3) then
begin
temp := (StrToInt(Key[I])- Box[(StrToInt(MeterID[I]) -Num[i mod 5]) 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;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -