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等。