Delphi关于改进AES算法的加解密文件功能
2007-07-22 14:40
393 查看
以下代码出自http://blog.csdn.net/hellogv/,引用请注明出处!
代码有点乱,想要具体实现方法的朋友,可以给我留言
附:以下代码在杨泽晖 (Jorlen Young)所开发的AES算法接口上改进!
代码有点乱,想要具体实现方法的朋友,可以给我留言
附:以下代码在杨泽晖 (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关于改进AES算法的加解密文件功能
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 关于项目中属性配置文件的改进
- 关于delphi如何调用用c写的*.h文件
- Delphi关于记录文件的操作
- Delphi XE2 新功能试用:ZIP压缩文件的操作
- DELPHI关于文件的操作
- 关于windows文件系统的文件隧道功能
- Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能
- 关于webdriver上传文件功能的一些补充
- delphi中关于ShellExecute打开文件所在的位置(处理文件名中有逗号,单引号问题)
- 关于使用MAPVIEWOFFILE大文件的读写(DELPHI版)
- 为记事本增加功能-大小写转换,加解密文件,字数统计
- Delphi使用文件拖放功能
- 关于项目中属性配置文件的改进
- 关于MAC OS下面两个软件的功能改进——Dictionary和Fit 输入法
- 关于laravel系统自带的文件上传功能(原创,超详细)
- DELPHI关于文件操作集锦
- 关于改进插入图片功能的想法
- Delphi 2010 新增功能之: 手势编程[5] - 关于自定义手势