有很多种方法,据一些简单的方法如下:
明文:abcdef,密钥:C(自己定义一个)
abcdef每一位和C异或-->结果(密文)
(密文)每一位和C异或-->结果(明文:abcdef)明文:abcdef通过移n位,后得到密文
abcdef-->左移1位-->密文bcdefg
密文bcdefg-->右移1位-->明文abcdef也可把这些多种简单的方法结合在一起成为一个复杂的方法。
明文:abcdef,密钥:C(自己定义一个)
abcdef每一位和C异或-->结果(密文)
(密文)每一位和C异或-->结果(明文:abcdef)明文:abcdef通过移n位,后得到密文
abcdef-->左移1位-->密文bcdefg
密文bcdefg-->右移1位-->明文abcdef也可把这些多种简单的方法结合在一起成为一个复杂的方法。
这里面没有固定的密钥,加密使用username和password
function encryptpassword(username:string;password:string):string;
var beforepassword,afterpassword:string;
i,j,k,len:integer;
order:integer;
begin
beforepassword:=username+password;
afterpassword:='';
len:=length(beforepassword);
if len = 0 then
afterpassword:='passwordnil'
else
begin
j:=0;
for i:=1 to len do
begin
j:=j+ord(beforepassword[i])+i;
end;
K:=round(j/len);
if len < 10 then
begin
for i:=1 to len do
begin
j:=ord(beforepassword[i]);
if j < k then
begin
order:=(j+k+i)mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
order:=(k-j+i)mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
end
else
begin
order:=(j+k+i)mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
order:=(j-k+i) mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
end;
end;
end
else
begin
for i:=1 to len do
begin
order:=ord(beforepassword[i]);
order:=order mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
end;
end;
end; encryptpassword:=afterpassword;
end;
我希望:'12k中华民族'-->'密文'-->'12k中华民族'(解密后能够正常显示为原来的文字)
var
i: integer;
begin
Result:=$12345678; // magic starter
for i:=1 to Length(key) do
begin
Result:=Result+ ord(key[i]) shl i;
end;
end;function ToggleText(var text: string; key: DWORD): string;
var
i: integer;
subKey: array [0..3] of byte;
begin
CopyMemory(@subKey,@key,sizeof(key));
for i:=1 to length(text) do
begin
text[i]:=chr(ord(text[i]) xor subKey[i mod 4]);
end;
end;procedure Test;
var
s: string;
begin
s:='test text';
ToggleText(s,GetXORKey('JGTM2000'));
ShowMessage(s); // 看看变成什么模样了
ToggleText(s,GetXORKey('JGTM2000')); // 如果不是JGTM2000就不一定对了
ShowMessage(s); // 回来了吧!
end;容易吧(而且效率相当高)?关键是这里的GetXORKey,要是能对不同的密码字串尽量不生成相同的Key效果更好(那样密码不一样肯定不对,比如可以用32bit CRC算法),我只是随手一写,仅作示意。当然,根据的你的保密要求的不同要具体情况具体分析的。
Function EncrypKey (Src:String; Key:String):string;
var
idx :integer;
KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :string;
SrcPos :Integer;
SrcAsc :Integer;
TmpSrcAsc :Integer;
Range :Integer;begin
KeyLen:=Length(Key);
if KeyLen = 0 then key:='Think Space';
KeyPos:=0;
SrcPos:=0;
SrcAsc:=0;
Range:=256;Randomize;
offset:=Random(Range);
dest:=format('%1.2x',[offset]);
for SrcPos := 1 to Length(Src) do
begin
SrcAsc:=(Ord(Src[SrcPos]) + offset) MOD 255;
if KeyPos < KeyLen then KeyPos:= KeyPos + 1 else KeyPos:=1;
SrcAsc:= SrcAsc xor Ord(Key[KeyPos]);
dest:=dest + format('%1.2x',[SrcAsc]);
offset:=SrcAsc;
end;
Result:=Dest;
end;//解密函数
Function UncrypKey (Src:String; Key:String):string;
var
idx :integer;
KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :string;
SrcPos :Integer;
SrcAsc :Integer;
TmpSrcAsc :Integer;
Range :Integer;begin
KeyLen:=Length(Key);
if KeyLen = 0 then key:='Think Space';
KeyPos:=0;
SrcPos:=0;
SrcAsc:=0;
Range:=256;
offset:=StrToInt('$'+ copy(src,1,2));
SrcPos:=3;
repeat
SrcAsc:=StrToInt('$'+ copy(src,SrcPos,2));
if KeyPos < KeyLen Then KeyPos := KeyPos + 1 else KeyPos := 1;
TmpSrcAsc := SrcAsc xor Ord(Key[KeyPos]);
if TmpSrcAsc <= offset then
TmpSrcAsc := 255 + TmpSrcAsc - offset
else
TmpSrcAsc := TmpSrcAsc - offset;
dest := dest + chr(TmpSrcAsc);
offset:=srcAsc;
SrcPos:=SrcPos + 2;
until SrcPos >= Length(Src);
Result:=Dest;
end;