数据库文件及内容的加密解密问题!(100分)

  • 主题发起人 主题发起人 powersun
  • 开始时间 开始时间
P

powersun

Unregistered / Unconfirmed
GUEST, unregistred user!
//加密解密单元
unit EncryptIt;

interface
USES
Classes;
const
C1 = 52845;
C2 = 22719;

procedure EncryptFile(INFName, OutFName : String; Key : Word);
procedure DecryptFile(INFName, OutFName : String; Key : Word);

implementation

procedure EncryptFile(INFName, OutFName : String; Key : Word);
VAR
MS, SS : TMemoryStream;
X : Integer;
C : Byte;
begin
MS := TMemoryStream.Create;
SS := TMemoryStream.Create;
TRY
MS.LoadFromFile(INFName);
MS.Position := 0;
FOR X := 0 TO MS.Size - 1 DO
begin
MS.Read(C, 1);
C := (C xor (Key shr 8));
Key := (C + Key) * C1 + C2;
SS.Write(C,1);
end;
SS.SaveToFile(OutFName);
FINALLY
SS.Free;
MS.Free;
end;
end;

procedure DecryptFile(INFName, OutFName : String; Key : Word);
VAR
MS, SS : TMemoryStream;
X : Integer;
C, O : Byte;
begin
MS := TMemoryStream.Create;
SS := TMemoryStream.Create;
TRY
MS.LoadFromFile(INFName);
MS.Position := 0;
FOR X := 0 TO MS.Size - 1 DO
begin
MS.Read(C, 1);
O := C;
C := (C xor (Key shr 8));
Key := (O + Key) * C1 + C2;
SS.Write(C,1);
end;
SS.SaveToFile(OutFName);
FINALLY
SS.Free;
MS.Free;
end;
end;

end.

//调用加密解密过程

procedure TForm1.Button1Click(Sender: TObject);
var
inf,outf:string;
w:word;
begin
inf:='h:/DELPHI程序/加密/db1.mdb' ;
outf:='h:/DELPHI程序/加密/加密后.123' ;
w:=1718;
EncryptFile(inf,outf,w);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
inf,outf:string;
w:word;
begin
inf:='h:/DELPHI程序/加密/加密后.123' ;
outf:='h:/DELPHI程序/加密/解密后.mdb' ;
w:=1718;

EncryptFile(inf,outf,w);
end;

为何解密还原后,文件长度不变,但"解密后.mdb"打不开,提示“不可识别的数据库格式”!我又试着将只将一个或几个字节加解密,还是不行!
另外一个问题:对数据库内容加密时遇到一个问题:关键字段加密后会不唯一,这个问题有何算法解决?
sun_soft@sina.com
谢谢!
 
你是对数据库的内容加密还是数据库文件加密呀?
我有几个加解密函数,可以给你参考
=================================
//uses Wait;
//---------密碼加密---------------------------
function PPbin(s:integer):Char;
begin
if s<0 then
s:=s+256
else if s>255 then
s:=s-256;
Result:=Chr(S); //IntToStr(integer(chr(s)));
end;

function pw2bin(str:string;l:boolean):string;
var
a1,a2,a3,a4,a5,a6:string;
begin
if l then begin
a1:=PPbin(ord(Str[1])+31);
a2:=ppbin(Ord(Str[2])-ord(Str[1])-2);
a3:=ppbin(ord(Str[3])-ord(Str[2])-3);
a4:=ppbin(ord(Str[4])-ord(str[3])-4);
a5:=ppbin(ord(Str[5])-ord(Str[4])-5);
a6:=ppbin(ord(Str[6])-ord(Str[5])-6);
end
else
begin
a1:=ppbin(ord(Str[1])-31);
a2:=ppbin(ord(Str[2])+ord(a1[1])+2);
a3:=ppbin(ord(Str[3])+ord(a2[1])+3);
a4:=ppbin(ord(Str[4])+ord(a3[1])+4);
a5:=ppbin(ord(Str[5])+ord(a4[1])+5);
a6:=ppbin(ord(Str[6])+ord(a5[1])+6);
end;
Result:=a1+a2+a3+a4+a5+a6;
end;
//-----------------------------------------
function Encrypt(S: string): string;
var
i,j,k1,k2: integer;
cSum,nSum: integer;
sTmp: string[8];
begin
Result := Space(8)+'??';

//檢查密碼是否合法.
S := TrimRight(S);
if Length(S) < 5 then
begin Showmessage('密碼長度最少必須5位'); Exit; end;
if Length(S) > 8 then
begin Showmessage('密碼長度超過8位'); Exit; end;
cSum:= 0;
nSum:= 0;
k1:=0;
k2:=0;
for i := 1 to Length(S) do begin
if not (S in ['A'..'Z','a'..'z','0'..'9']) then
begin Showmessage('密碼含有不合法字元'); Exit; end;
if S in ['A'..'Z','a'..'z'] then Inc(cSum);
if S in ['0'..'9'] then Inc(nSum);
end;
if cSum < 3 then
begin Showmessage('密碼最少必須含3位字母'); Exit; end;
if nSum < 2 then
begin Showmessage('密碼最少必須含2位數字'); Exit; end;

//加密.
Randomize;
while True do begin
k1 := Random(30);
k2 := Random(30);
sTmp := PadR(S,8);
Result := '';
for i := 1 to 8 do begin
j := k1 Mod 30 + i;
j := (k2+j) Mod 30 + 1;
Result := Result + Chr(Ord(sTmp) xor j)
end;
if (Pos('"',Result)>0) or (Pos('''',Result)>0) then
Else Break;
end;
Result := Result + Chr(k1+40) + Chr(k2+60);
end;

//--------密碼解密----------------------------
function Decrypt(S: string): string;
var
i,j: integer;
Key1,Key2: integer;
begin
Result := '??'+Space(6);

//檢查密碼是否正確.
if Length(S) <> 10 then Exit;

//解密
Key1 := Ord(S[9])-40;
Key2 := Ord(S[10])-60;
Result := '';
for i := 1 to 8 do begin
j := Key1 Mod 30 + i;
j := (Key2+j) Mod 30 + 1;
Result := Result + Chr(Ord(S) xor j)
end;
Result := Trim(Result);
end;
//--------字元加密----------------------------
function EncryStr(S: String;n:Integer): String;
var
i,j,k1,k2: integer;
sTmp: String;
begin
//加密.
Randomize;
while True do begin
k1 := Random(30);
k2 := Random(30);
sTmp := PadR(S,n);
Result := '';
for i := 1 to n do begin
j := k1 Mod 30 + i;
j := (k2+j) Mod 30 + 1;
Result := Result + Chr(Ord(sTmp) xor j)
end;
if (Pos('"',Result)>0) or (Pos('''',Result)>0) then
Else Break;
end;
Result := Result + Chr(k1+40) + Chr(k2+60);
end;
//--------字元解密----------------------------
function DecryStr(S: String;n:Integer): String;
var
i,j: integer;
Key1,Key2: integer;
begin
//檢查密碼是否正確.
if Length(S) <> n+2 then Exit;

//解密
Key1 := Ord(S[n+1])-40;
Key2 := Ord(S[n+2])-60;
Result := '';
for i := 1 to n do begin
j := Key1 Mod 30 + i;
j := (Key2+j) Mod 30 + 1;
Result := Result + Chr(Ord(S) xor j)
end;
Result := Trim(Result);
end;

 
对数据库的内容加密、对数据库文件加密是分开的两个问题!呵呵!
 
对数据库文件加密的算法深度历险里有。
 
我认为加密文件有些不妥,因为加密时如果遇到停电或死机,而加密过程没有结束,
对文件来讲是一种破坏,到时恢复也不行,解密也不行,那很惨。
 
对数据库内容加密时遇到一个问题:关键字段加密后会不唯一,这个问题有何算法解决?
 
不对关键字段加密, 我也认为不能对文件进行加密
 
你用是什么加密算法? 换一种RSA或BLOWFISH试试.
 
后退
顶部