`

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;

//-----------------------【加密解密基础函数】---------------------------------------------------- 
分享到:
评论

相关推荐

    Delphi.rar_AES_AES加密_delphi AES加密_delphi 加解密_java delphi aes

    本资源"Delphi.rar_AES_AES加密_delphi AES加密_delphi 加解密_java delphi aes"提供的是在Delphi编程环境中实现AES加密和解密的示例代码,其目标是与Java平台上的加解密过程保持兼容。 首先,让我们深入了解一下...

    Delphi XE2+标准AES加解密算法(AES/EBC,CBC/PKCS5Padding-base64)

    是标准的AES算法,支持在线AES加解密网站互解。 本源码从CSDN一位前辈的源码基础上做了更改,增加支持加密返回BASE64,更加完善。在此感谢原作者: http://download.csdn.net/download/qiaohaidong/9477264 需要注意...

    delphi AES加解密算法

    在Delphi中实现AES加解密算法,开发者可以使用现有的加密库,如TIdCryptAES组件,或者自定义代码来实现AES算法的不同模式,如ECB、CBC、CFB、OFB等。 在描述中提到的"能与php、java顺利对接",意味着这个Delphi实现...

    Delphi下AES算法完整源码与调用方法

    在Delphi编程环境中,你可以使用AES算法来确保数据的安全,无论是进行数据存储还是传输。本资源提供了在Delphi 7环境下编译通过的完整的AES算法源码,非常适合 Delphi 开发者学习和应用。 首先,AES的核心思想是...

    delphi xe2 AES加密解密

    delphi xe2 AES加密解密算法

    Delphi版AES加密解密模块源码,支持128位、192位、256位密钥

    `AESCrypts.pas` 文件很可能是实现AES加密解密功能的核心源代码文件,其中可能包含AES的初始化、加密和解密函数。这些函数可能采用了一些常见的编程结构,如使用密钥扩展过程生成加密所需的轮密钥,以及执行AES的多...

    delphi 实现AES加/解密

    AES 是一种使用安全码进行信息加密的标准。 它支持 128 位、192 位和 256 位长度的密匙。 加密算法的实现在 ElAES.pas 单元中。 本人将其加密方法封装在 AES.pas 单元中, 只需要调用两个标准函数就可以完成字符串...

    delphi 7实现AES 128位加解密

    算法模式:ECB(Electronic Code Book,电子密码本) 模式 密钥长度:128位 补码方式:PKCS5Padding 加密结果编码方式:base64 ...delphi 7实现,经测试加密、解密正确,与在线网站加密、解密结果一致!

    AES for Delphi 加密解密

    AES for Delphi 加密解密,代码在Delphi10.2.3下已调试通过。 算法模式包含: CBC(Cipher Block Chaining,加密块链) 模式、 ECB(Electronic Code Book,电子密码本) 模式 加密结果包含:十六进制、base64 补码方式:...

    Delphi AES 加密解密控件 Cipher_Component(1.0.0.0).rar

    1.AES算法 AES-128-CBC、AES-192-CBC、AES-256-CBC; AES-128-CFB、AES-192-CFB、AES-256-CFB; AES-128-CFB1、AES-192-CFB1、AES-256-CFB1; AES-128-CFB8、AES-192-CFB8、AES-256-CFB8; AES-128-ECB、AES-192-...

    AES.rar_2007_AES_delphi_delphi aes _delphi 加解密

    标题中的"AES.rar_2007_AES_delphi_delphi aes _delphi 加解密"表明这个压缩包包含了与AES加密算法在Delphi 2007环境下实现相关的代码或资源。AES,全称为Advanced Encryption Standard(高级加密标准),是一种广泛...

    aes加密算法delphi

    以上四个函数共同构成了在Delphi中实现AES加密算法所需的基本字符串处理功能。它们分别负责了填充与去填充、以及文本与十六进制之间的转换。这些函数的正确使用对于确保AES加密过程的有效性和安全性至关重要。在实际...

    AES加密算法 delphi7

    例如,`AES.v1.3`可能是一个包含AES加密算法实现的Delphi 7工程文件,其中包含了加密和解密的示例代码,可以帮助开发者快速理解和应用AES算法。 使用AES加密时,需要注意以下几点: - **密钥管理**:密钥的安全存储...

    AES加密/解密,C,java,delphi互解

    在标题中提到的"C, java, delphi互解"意味着这个压缩包内包含了用C、Java和Delphi三种编程语言实现的AES加密和解密功能,而且这些实现可以相互兼容,这意味着无论你在哪个平台上或使用哪种语言,都能对加密的数据...

    Delphi与JAVA互加解密AES算法

    本组代码采用标准AES算法(基础算法引用ElAES.pas,感谢作者),代码支持AES/ECB/PKCS5Padding、AES/CBC/PKCS5Padding 密钥长度128/192/256bit,密钥0填充,Delphi与JAVA互相加解密。

    AES加解密的delphi源码

    在给定的“AES加解密的delphi源码”中,我们可以深入了解如何使用Delphi编程语言实现AES的加解密功能。Delphi是基于Object Pascal的集成开发环境,以其高效、快速的编译器和丰富的组件库而著名,非常适合用于开发...

    DelphiXE10.3与Java互通AES加解密算法,亲测可用.zip

    DelphiXE10.3与Java互通AES加解密算法,亲测可用。支持ECB、CBC算法,支持128、192、256密匙长度,支持密匙和向量设置,支持补码方式PKCS5和PKCS7,支持16进制密文和Base64密文。

    AES加密算法 Delphi7

    在Delphi7中,ElAES.pas是一个第三方组件,用于方便地集成AES算法。这个组件通常包含一系列的函数和过程,允许开发者轻松地对数据进行加密和解密。首先,你需要在工程中引入ElAES.pas文件,然后就可以调用相应的函数...

    Delphi与Java互通AES加解密算法.zip

    本资源"Delphi与Java互通AES加解密算法.zip"正专注于解决这一问题,提供了一套适用于Delphi和Java环境的AES(Advanced Encryption Standard)加解密算法,确保在两种语言之间进行安全的数据传输。 AES,即高级加密...

    Delphi 加密解密 AES DES RC Blowfish等算法控件源程序 Cipher_Component(1.0.0.0).rar

    在 Delphi 中,通过提供的控件,开发者可以轻松地在应用程序中集成 AES 加密和解密功能。 2. **DES(Data Encryption Standard)**:DES 是一个较老的对称加密算法,使用56位的密钥。尽管已被认为不够安全,但某些...

Global site tag (gtag.js) - Google Analytics