Delphi关于改进AES算法的加解密文件功能

               

以下代码出自http://blog.csdn.net/hellogv/,引用请注明出处!


代码有点乱,想要具体实现方法的朋友,可以给我留言

附:以下代码在杨泽晖 (Jorlen Young)所开发的AES算法接口上改进!

function StrToHex(Value: string): string;var  I: Integer;begin  Result := ''for I := 1 to Length(Value) do    Result := Result + IntToHex(Ord(Value[I]), 2);end; function EncryptString(Value: string; Key: string): string;var  SS, DS: TStringStream;  Size: Int64;  AESKey256: TAESKey256;begin  Result := '';  SS := TStringStream.Create(Value);  DS := TStringStream.Create('');  try    Size := SS.Size;    DS.WriteBuffer(Size, SizeOf(Size));    FillChar(AESKey256, SizeOf(AESKey256), 0 );    Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));    EncryptAESStreamECB(SS, 0, AESKey256, DS);    Result := StrToHex(DS.DataString);  finally    SS.Free;    DS.Free;  end;end;function HexToStr(Value: string): string;var  I: Integer;begin  Result := ''for I := 1 to Length(Value) do  begin    if ((I mod 2) = 1) then      Result := Result + Chr(StrToInt('0x'+ Copy(Value, I, 2)));  end;end;function DecryptString(Value: string; Key: string): string;var  SS, DS: TStringStream;  Size: Int64;  AESKey256: TAESKey256;begin  Result := '';  SS := TStringStream.Create(HexToStr(Value));  DS := TStringStream.Create('');  try    Size := SS.Size;    SS.ReadBuffer(Size, SizeOf(Size));    FillChar(AESKey256, SizeOf(AESKey256), 0 );    Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));    DecryptAESStreamECB(SS, SS.Size - SS.Position, AESKey256, DS);    Result := DS.DataString;  finally    SS.Free;    DS.Free;  end;end;// ---------- 文件加密函数 按照 256 位密匙加密procedure TSysClass.EncryptFile(SourceFile, DestFile: string;Key: string);var  SFS, DFS: TFileStream;  Size: Int64;  AESKey256: TAESKey256;  info:string;begin  SFS := TFileStream.Create(SourceFile, fmOpenRead);  try    DFS := TFileStream.Create(DestFile, fmCreate);    try    //-----------------------------文件解密部分---------------------------------      Size := SFS.Size;      DFS.WriteBuffer(Size, SizeOf(Size));      FillChar(AESKey256, SizeOf(AESKey256), 0 );      Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));      EncryptAESStreamECB(SFS, 0, AESKey256, DFS);    //-----------------------------在文件尾部加入判断解密是否成功的信息----------      info:=EncryptString('123456789',Key);      DFS.Seek(0,soFromEnd);      DFS.Write(Info[1],60);//往后面写入60个字符,其中有一些保留没有使用    finally      DFS.Free;    end;  finally    SFS.Free;  end;end;// ---------- 文件解密函数 按照 256 位密匙解密Function TSysClass.DecryptFile(SourceFile, DestFile: string;Key: string):boolean;var  Test, DFS: TFileStream;  SFS:TMemoryStream;  Size: Int64;  AESKey256: TAESKey256;  Info:string;begin  SetLength(Info,60)//----------------------------------------先检测文件解密是否正确-------------------  Test := TFileStream.Create(SourceFile, fmOpenRead);  try    Test.Seek(-60,soFromEnd);    Test.Read(Info[1],60);    //-----------------------------判断密码是否正确,如果错误    if AnsiContainsStr(Trim(info),EncryptString('123456789',Key)) = false then begin       result:=false;//解密失败       Test.Free;//释放流       exit;    end;    //-----------------------------如果密码正确,取得实际文件的内容    Test.Seek(0,soFromBeginning);    SFS:=TMemoryStream.Create;    SFS.CopyFrom(Test,Test.Size-60);    Test.Free;  except //-----------------------如果出现异常不能打开文件    SFS.Free;    Test.Free;    result:=false;    exit;  end;  //-------------------------------正式开始解密  SFS.Position:=0;  SFS.ReadBuffer(Size, SizeOf(Size));  DFS := TFileStream.Create(DestFile, fmCreate);  FillChar(AESKey256, SizeOf(AESKey256), 0 );  Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));  DecryptAESStreamECB(SFS, SFS.Size - SFS.Position, AESKey256, DFS);  DFS.Size := Size;  DFS.Free;  SFS.Free;  result:=true;end;//-----------------------【加密解密基础函数】---------------------------------------------------- 
           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43666994/article/details/87812352