gpt4 book ai didi

delphi - 使用密码加密 .INI 文件字符串的简单代码

转载 作者:行者123 更新时间:2023-12-03 14:40:42 31 4
gpt4 key购买 nike

我正在寻找比 ROT13 更复杂的东西,但它不需要库(最好甚至不需要一个单元,只需一个函数即可)。

我想使用用户提供的密码对称地加密/解密给定的字符串。但是,结果必须是一个字符串,从某种意义上说,我必须能够将其存储在 .INI 文件中。

有人有一个简单的函数可以做到这一点吗(delphi XE2)?如今,Google 不再是我的 friend 。

提前致谢

<小时/>

[更新]/[赏金]只是为了说清楚(如果最初不是这样,请原谅),我不需要哈希。我有一个列表框,用户可以在其中添加/修改/删除条目。我想在程序关闭时将它们存储在 .INI 文件中,并在程序再次启动时重新加载。任何查看 .INI 文件(例如,在记事本中打开它)的人都应该无法读取这些字符串。

我想我可以将组件作为二进制流传输,但为了安心,我宁愿使用用户提供的密码来加密字符串。出于此应用程序的目的,.INI 文件部分名称或 key 值是否是人类可读的并不重要,我只是想加密数据,在存储在磁盘上时给我一些列表:

[config]
numEntries=3

[listbox]
0=ywevdyuvewfcyuw
1=edw
2=hr4uifareiuf

最佳答案

这是 Tinifile 的替代品。
ReadString 和 WriteString 被重写,这些是内部用于 Read/WriteFloat、Read/WriteInteger 等的。

字符串被加密并存储为十六进制字符串。

演示用法:

uses CryptingIni;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
ini:TCryptingIni;
begin
ini:=TCryptingIni.Create('C:\temp\test.ini');
ini.UseInternalVersion(1234);
ini.WriteFloat('Sect','Float',123.456);
ini.WriteString('Sect2','String','How to encode');
ini.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
ini:TCryptingIni;
begin
ini:=TCryptingIni.Create('C:\temp\test.ini');
ini.UseInternalVersion(1234);
Showmessage(FloatToStr(ini.ReadFloat('Sect','Float',0)));
Showmessage(ini.ReadString('Sect2','String',''));
Showmessage(ini.ReadString('SectUnkknow','Showdefault','DEFAULT'));
ini.Free;
end;

您可以通过UseInternalVersion使用内部加密方法,或提供自己的程序
过程 SetCryptingData(aEncryptProc, aDecryptProc: CryptingProc; aKey: Word);

unit CryptingIni;

// 2013 by Thomas Wassermann
interface

uses
Windows, SysUtils, Variants, Classes, inifiles;

type

CryptingProc = Function(const InString: String; Key: Word): String;

TCryptingIni = Class(TInifile)
function ReadString(const Section, Ident, Default: string): string; override;
procedure WriteString(const Section, Ident, Value: String); override;
private
FEncryptProc: CryptingProc;
FDecryptProc: CryptingProc;
FKey: Word;
public
Procedure SetCryptingData(aEncryptProc, aDecryptProc: CryptingProc; aKey: Word);
Procedure UseInternalVersion(aKey: Word);
End;

implementation

const
c1 = 52845;
c2 = 22719;

Type
TByteArray = Array [0 .. 0] of byte;

Function AsHexString(p: Pointer; cnt: Integer): String;
var
i: Integer;
begin
Result := '';
for i := 0 to cnt do
Result := Result + '$' + IntToHex(TByteArray(p^)[i], 2);
end;

Procedure MoveHexString2Dest(Dest: Pointer; Const HS: String);
var
i: Integer;
begin
i := 1;
while i < Length(HS) do
begin
TByteArray(Dest^)[i div 3] := StrToInt(Copy(HS, i, 3));
i := i + 3;
end;
end;

function EncryptV1(const s: string; Key: Word): string;
var
i: smallint;
ResultStr: string;
UCS: WIDEString;
begin
Result := s;
if Length(s) > 0 then
begin
for i := 1 to (Length(s)) do
begin
Result[i] := Char(byte(s[i]) xor (Key shr 8));
Key := (smallint(Result[i]) + Key) * c1 + c2
end;
UCS := Result;
Result := AsHexString(@UCS[1], Length(UCS) * 2 - 1)
end;
end;

function DecryptV1(const s: string; Key: Word): string;
var
i: smallint;
sb: String;
UCS: WIDEString;
begin
if Length(s) > 0 then
begin
SetLength(UCS, Length(s) div 3 div 2);
MoveHexString2Dest(@UCS[1], s);
sb := UCS;
SetLength(Result, Length(sb));
for i := 1 to (Length(sb)) do
begin
Result[i] := Char(byte(sb[i]) xor (Key shr 8));
Key := (smallint(sb[i]) + Key) * c1 + c2
end;
end
else
Result := s;
end;

{ TCryptingIni }

function TCryptingIni.ReadString(const Section, Ident, Default: string): string;
begin
if Assigned(FEncryptProc) then
Result := inherited ReadString(Section, Ident, FEncryptProc(Default, FKey))
else
Result := inherited ReadString(Section, Ident, Default);
if Assigned(FDecryptProc) then
Result := FDecryptProc(Result, FKey);
end;

procedure TCryptingIni.SetCryptingData(aEncryptProc, aDecryptProc: CryptingProc; aKey: Word);
begin
FEncryptProc := aEncryptProc;
FDecryptProc := aDecryptProc;
FKey := aKey;
end;

procedure TCryptingIni.UseInternalVersion(aKey: Word);
begin
FKey := aKey;
FEncryptProc := EncryptV1;
FDecryptProc := DecryptV1;
end;

procedure TCryptingIni.WriteString(const Section, Ident, Value: String);
var
s: String;
begin
if Assigned(FEncryptProc) then
s := FEncryptProc(Value, FKey)
else
s := Value;
inherited WriteString(Section, Ident, s);
end;

end.

关于delphi - 使用密码加密 .INI 文件字符串的简单代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14411975/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com