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

本文提供了一种基于256位密钥的AES加密和解密算法的实现方法,包括字符串和文件的加密解密过程。通过使用Delphi语言,文章详细展示了如何将明文转换为密文,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下代码出自http://blog.youkuaiyun.com/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;

//-----------------------【加密解密基础函数】---------------------------------------------------- 
(*****************************************************)(* *)(* Advanced Encryption Standard (AES) *)(* Interface Unit v1.3 *)(* *)(* Readme.txt 自述文档 2004.12.04 *)(* *)(*****************************************************)(* 介绍 *)AES 是一种使用安全码进行信息加密的标准。它支持 128 位、192 位和 256 位的密匙。加密算法的实现在 ElAES.pas 单元中。本人将其加密方法封装在 AES.pas 单元中,只需要调用两个标准函数就可以完成字符串的加密和解密。(* 密匙长度 *)128 位支持长度为 16 个字符192 位支持长度为 24 个字符256 位支持长度为 32 个字符所有加密和解密操作在默认情况下为 128 位密匙。(* 文件列表 *)..Source AES 单元文件..Example 演示程序(* 适用平台 *)这份 Delphi 的执行基于 FIPS 草案标准,并且 AES 原作者已经通过了以下平台的测试: Delphi 4 Delphi 5 C++ Builder 5 Kylix 1本人又重新进行了补充测试,并顺利通过了以下平台: Delphi 6 Delphi 7特别说明: 在 Delphi 3 标准版中进行测试时,因为缺少 Longword 数据类型和 Math.pas 文件,并且不支持 overload 指示字,所以不能正常编译。(* 演示程序 *)这个示例程序演示了如何使用 AES 模块进行字符串的加密和解密过程。(* 使用方法 *)在程序中引用 AES 单元。调用函数 EncryptString 和 DecryptString 进行字符串的加密和解密。调用函数 EncryptStream 和 DecryptStream 进行流的加密和解密。调用过程 EncryptFile 和 DecryptFile 进行文件的加密和解密。详细参阅 Example 文件夹中的例子。(* 许可协议 *)您可以随意拷贝、使用和发部这个程序,但是必须保证程序的完整性,包括作者信息、版权信息和说明文档。请勿修改作者和版权信息。 这个程序基于 Mozilla Public License Version 1.1 许可,如果您使用了这个程序,那么就意味着您同意了许可协议中的所有内容。您可以在以下站点获取一个许可协议的副本。 http://www.mozilla.org/MPL/许可协议的发布基于 "AS IS" 基础,详细请阅读该许可协议。Alexander Ionov 是 AES 算法的最初作者,保留所有权利。(* 作者信息 *)ElAES 作者:EldoS, Alexander IonovAES Interface Unit 作者: (Jorlen Young)您可以通过以下方式与我取得联系。WebSite: http://jorlen.51.net/ http://mycampus.03.com.cn/ http://mycampus.1155.net/ http://mycampus.ecoo.net/ http://mycampus.5500.org/Email: stanley_xfx@163.com
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值