delphi简单的文件加密和解密(异或运算)

var
  Form1: TForm1;
   MaxBufferSize:Integer ;


implementation

{$R *.dfm}

procedure EncryptFile(const FileName, OutputFileName: string; const Key: Word);
var
  InputFile, OutputFile: TFileStream;
  Buffer: array of Byte; // 动态大小的缓冲区
  BytesRead, I: Integer;
  EncryptedByte: Byte;
begin
  InputFile := TFileStream.Create(FileName, fmOpenRead);
  OutputFile := TFileStream.Create(OutputFileName, fmCreate);
  try
    SetLength(Buffer, MaxBufferSize); // 根据最大缓冲区大小设置动态缓冲区大小

    while InputFile.Position < InputFile.Size do
    begin
      BytesRead := InputFile.Read(Buffer[0], Length(Buffer));
      for I := 0 to BytesRead - 1 do
      begin
        EncryptedByte := Buffer[I] xor (Key shr 8);
        Buffer[I] := EncryptedByte;
      end;
      OutputFile.WriteBuffer(Buffer[0], BytesRead);
    end;
  finally
    InputFile.Free;
    OutputFile.Free;
  end;
end;

procedure DecryptFile(const FileName, OutputFileName: string; const Key: Word);
begin
  // 解密与加密相同,因为异或运算是可逆的
  EncryptFile(FileName, OutputFileName, Key);
end;


// 使用示例
procedure TForm1.btnbutClick(Sender: TObject);
var
  InputFileName, EncryptedFileName, DecryptedFileName: string;
  Key: Word;
  FileStream: TFileStream;
  Buffer: TBytes;
  MaxBufferSize: Integer;
begin
// 'C:\Users\Administrator.DESKTOP-0DCBHA5\OneDrive - Stella International Holdings Limited\文档\UiPath\SPECToTest\1231231.txt'
  InputFileName := 'C:\Users\Administrator\Downloads\九興服務_UiPath Studio基礎開發教育訓練 (1).pdf'; // 输入文件名
  EncryptedFileName := 'C:\Users\Administrator\Downloads\九興服務_UiPath Studio基礎開發教育訓練1.pdf'; // 加密后文件名
  DecryptedFileName := 'C:\Users\Administrator\Downloads\九興服務_UiPath Studio基礎開發教育訓練2.pdf'; // 解密后文件名
  Key := 21235; // 加密密钥
  FileStream := TFileStream.Create('C:\Users\Administrator\Downloads\九興服務_UiPath Studio基礎開發教育訓練 (1).pdf', fmOpenRead);
  try
    // 获取文件大小
    MaxBufferSize := FileStream.Size;

    // 根据文件大小调整缓冲区大小
    SetLength(Buffer, MaxBufferSize);

    // 读取文件内容到缓冲区
    FileStream.ReadBuffer(Buffer[0], MaxBufferSize);

  finally
    FileStream.Free;
  end;
        // 在这里可以对缓冲区进行处理或使用
  try
    EncryptFile(InputFileName, EncryptedFileName, Key);
    ShowMessage('文件加密成功');
  except
    ShowMessage('文件加密失败');
  end;
  try
    DecryptFile(EncryptedFileName, DecryptedFileName, Key);
    ShowMessage('文件解密成功');
  except
    ShowMessage('文件解密失败');
  end;
end;


end.

InputFileName 需要加密的文件路径
EncryptedFileName 加密完成以后得文件路径加文件名
DecryptedFileName 解密成功以后存放的文件路径
Key 秘钥
FileStream 计算加密需要的内存空间文件路径

在这个代码中,加密和解密的过程是一样的,因为它们使用了异或运算(xor),而异或运算是可逆的。在加密过程中,将每个字节与密钥的右移8位进行异或运算,得到加密后的字节,并将加密后的缓冲区写入输出文件。在解密过程中,同样对每个字节进行异或运算,使用相同的密钥进行解密,得到原始的字节,并将解密后的缓冲区写入输出文件。

需要注意的是,这种简单的异或运算并不是一种强大的加密算法,它只是一个基本的示例。在实际的加密应用中,我们需要使用更加复杂和安全的加密算法,如AES或RSA等。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值