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

📄 aesu.pas

📁 AES加密解密程序(开发语言delphi)
💻 PAS
📖 第 1 页 / 共 2 页
字号:
   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 + -