`

Delphi在二进制文件头部加数据或删除数据

 
阅读更多

今天想要在一个二进制文件头部加上一个特殊标志,在后续处理时又需要把该标志先移除。在网上搜了很久,没有很好的解决办法,最后想了个办法,用一个临时Stream来处理。上代码:

 

const
   EncFileHeader = '1234567890';  //特殊标志

function EncryptFile(inFile, outFile: PChar; password: PChar): Boolean; stdcall;
var
  output: TFileStream;
  input: TFileStream;
  AES: TAESFull;
  bFlag: Boolean;
  keySize: integer;
  Pass: String;
  Digest: TSHA256Digest;
  ret: Integer;
  tmpStream: TMemoryStream;
begin

  Pass := Password;
  SHA256Weak(Pass, Digest);

  Result := True;
  if inFile = outFile then
  begin
    Result := False;
    Exit;
  end;
  bFlag := True;

  keySize := sizeof(Digest)*8;
  if keySize <128 then keySize := 128;

  tmpStream := TMemoryStream.Create;
  try
    input := TFileStream.Create (inFile, fmOpenRead);
    output := TFileStream.Create (outFile, fmCreate);
    ret := AES.EncodeDecode (Digest, keySize, input.Size, bFlag, input, output, nil, nil);

    //往输出文件头中写入特殊标志
    output.Seek(0, soFromBeginning);
    tmpStream.Write(EncFileHeader, length(EncFileHeader));
    tmpStream.CopyFrom(output, output.Size);
    output.Free;
    output := TFileStream.Create (outFile, fmCreate);
    tmpStream.Seek(0, soFromBeginning);
    output.CopyFrom(tmpStream, tmpStream.Size);
    //写入特殊标志结束

    if ret<>0 then Result := False;
  finally
    input.Free;
    output.Free;
    tmpStream.Free;
  end;
end;
function EncFile(inFile, outFile: PChar): Boolean; stdcall;
begin
  Result := EncryptFile(inFile, outFile, PChar(GetEK()));
end;

function DecryptFile(inFile, outFile: PChar; password: PChar): Boolean; stdcall;
var
  output: TFileStream;
  input: TFileStream;
  tmpStream: TStringStream;
  AES: TAESFull;
  bFlag: Boolean;
  keySize: integer;
  Pass: String;
  Digest: TSHA256Digest;
  ii, ret: Integer;
  Buffer: array of byte;
  sTmp: String;
begin

  Pass := Password;
  SHA256Weak(Pass, Digest);

  Result := True;
  if inFile = outFile then
  begin
    Result := False;
    Exit;
  end;
  bFlag := False;

  keySize := sizeof(Digest)*8;
  if keySize <128 then keySize := 128;

  SetLength(Buffer, Length(EncFileHeader));
  try
    input := TFileStream.Create (inFile, fmOpenRead);
    output := TFileStream.Create (outFile, fmCreate);

    //把文件头上特殊标志移除(跳过)
    tmpStream := TStringStream.Create('');
    if input.Size > Length(EncFileHeader) then
    begin
      tmpStream.CopyFrom(input, Length(EncFileHeader));
      if tmpStream.DataString <> EncFileHeader then
      begin
        //当文件头部信息与特殊标志不相符时,认为没有特殊标志,则把指针指回到0,让后续代码从头开始处理流;
     //否则,后续代码从当前位置开始处理,即跳过了特殊标志
        tmpStream.Seek(0, soFromBeginning); 
      end;
    end;

    ret := AES.EncodeDecode (Digest, keySize, input.Size, bFlag, input, output, nil, nil);
    if ret<>0 then Result := False;
  finally
    input.Free;
    output.Free;
    tmpStream.Free;
  end;
end;

 

分享到:
评论

相关推荐

    delphi读写PE文件

    综上所述,这个主题涵盖了Delphi编程、PE文件结构、文件I/O以及资源管理等多个方面,是深入学习系统编程和二进制文件操作的一个实例。通过这样的实践,开发者可以增强对PE文件格式的理解,并掌握在Delphi中处理这类...

    base64字符串和图片的相互转换

    Base64是一种用于在网络上传输二进制数据的编码方式,它将任意的二进制数据转换成可打印的ASCII字符序列。这个过程通常用于在邮件系统、HTTP头部或者HTML中传输图片、文档等非文本内容。在描述的场景中,我们有两个...

    ExpressVerticalGrid V3.0.2 for D6

    "资源"可能指的是安装包中除了二进制文件之外的其他文件,如帮助文档、示例代码或图标等。 在压缩包的文件名称列表中: - `layout.bin` 可能是保存控件布局信息的文件,用于恢复或保存自定义的网格布局设置。 - `...

    vc++ 应用源码包_5

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    vc++ 应用源码包_1

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    vc++ 应用源码包_2

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    vc++ 应用源码包_6

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    vc++ 应用源码包_3

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

Global site tag (gtag.js) - Google Analytics