求加解密函数,加密前是数字字符串,要求加密后也是数字字符串,长度可以不同(100分)

  • 主题发起人 主题发起人 star123456
  • 开始时间 开始时间
S

star123456

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,急
 
不知你需要加密数据的重要程度,如果是自己使用,你自己可以利用循环移位和异或运算甚至加上其它算法自己组合一个就可,解密时进行反运算。
 
const
C1 = 52845;//你可以自行修改
C2 = 22719;//你可以自行修改

function TransChar(AChar: Char): Integer;
begin
if AChar in ['0'..'9'] then
Result := Ord(AChar) - Ord('0')
else
Result := 10 + Ord(AChar) - Ord('A');
end;

function StrToHex(AStr: string): string;
var
I : Integer;
Tmp: string;
begin
Result := '';
For I := 1 to Length(AStr) do
begin
Result := Result + Format('%2x', [Byte(AStr)]);
end;
I := Pos(' ', Result);
While I <> 0 do
begin
Result := '0';
I := Pos(' ', Result);
end;
end;

function HexToStr(AStr: string): string;
var
I : Integer;
CharValue: Word;
begin
Result := '';
For I := 1 to Trunc(Length(Astr)/2) do
begin
Result := Result + ' ';
CharValue := TransChar(AStr[2*I-1])*16 + TransChar(AStr[2*I]);
Result := Char(CharValue);
end;
end;

function Encrypt(const S: String
Key: Word): String;
var
I : Integer;
begin
Result := S;
for I := 1 to Length(S) do
begin
Result := char(byte(S) xor (Key shr 8));
Key := (byte(Result) + Key) * C1 + C2;
if Result = Chr(0) then
Result := S;
end;
Result := StrToHex(Result);
end;

function Decrypt(const S: String
Key: Word): String;
var
I: Integer;
S1: string;
begin
S1 := HexToStr(S);
Result := S1;
for I := 1 to Length(S1) do
begin
if char(byte(S1) xor (Key shr 8)) = Chr(0) then
begin
Result := S1;
Key := (byte(Chr(0)) + Key) * C1 + C2
//保证Key的正确性
end else
begin
Result := char(byte(S1) xor (Key shr 8));
Key := (byte(S1) + Key) * C1 + C2;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text:=Encrypt(Edit1.Text,12345);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Edit3.Text:=Decrypt(Edit2.Text,12345);
end;
 
加密强度要求不是太高,让人不能根据原来的字符串和加密的字符串猜出加密算法就行。
楼上,请看清楚我的题目,要求加密后字符串是数字字符串。
 
上面给出的算法稳定性不是很高, 有一个base64加密算法可地考虑.
虽然上面的算法加密后不是数字, 但是你可以做一个封装, 进行一下
转换就行了嘛.
如;
var
str, deststr
string;
p
pchar;
i
integer
begin
str ;='test';
str ;= Encrypt(str,1234);
p ;= pchar(str);
for i;=0 to length(str)-1 do
deststr ;= deststr + inttostr(ord(p));

end;

大致思路就是上面那样, 你可以根据需要更改, 为了解密最好将每个字符p转换成三个数字串, 不够时前面补0.
 
楼上,我这个加密后的数字串,长度不能超过32,你说的方法,长度很容易超出。
 
这样;
如果比较长可以这么处理;

const
base = 100000;// can modify
fieldlen=10;
var
a,b,c
integer;
str
string;
deststr
string;
i
integer;
begin
str ;= '';// 设str是加密后的长串数字
i;=0;
while i*fieldlen<length(str) do
begin
c ;= inttostr(copy(str, i*fieldlen+1, fieldlen));
a ;= c div base;
b ;= c mod base;
deststr ;= inttostr(a)+ inttostr(b)
end;
end;
可以想一下,是否可行, 这只是一个思路.
 
纠正一下
上面应该是;strtoint(copy(...))
一般加密算法加密结果都会随信息量的增多而增长,自已多想想办法做下特殊处理就行了.
 
{
名称:双向流式数字字符串加密算法
作者:creation_zy
时间:2006-4
备注:
Str为仅包含数字'0'..'9'的字符串。
Key为0..9999的整数。
适当的增大参数Times(加密次数)可以极大的提高密文的难解性,但是耗时也会
成比例增加,对于长度在1KB以内的文本,建议将其控制在1-1024之内。
}
const
Byte0=Byte('0');
procedure SeqNumEnc(var Str: String
Key: Word
Times: Integer);
var
i,c,n:Integer

Key1,Key2,Key3,Key4:Byte;
begin
n:=Length(Str);
if n=0 then exit;
Key4:=Byte((Key div 1000) mod 10);
Key3:=Byte((Key div 100) mod 10);
Key2:=Byte((Key div 10) mod 10);
Key1:=Byte(Key mod 10);
for c:=Times-1 downto 0 do
begin
Str[1]:=Char((Byte(Str[1])-Byte0+Key3+10) mod 10+Byte0);
for i:=2 to n do
Str:=Char(((Byte(Str[i-1])+Byte(Str)-Byte0*2)+Key1+20) mod 10+Byte0);
Str[n]:=Char((Byte(Str[n])-Byte0+Key4+10) mod 10+Byte0);
for i:=n-1 downto 1 do
Str:=Char(((Byte(Str[i+1])+Byte(Str)-Byte0*2)+Key2+20) mod 10+Byte0);
end;
end;
procedure SeqNumDec(var Str: String
Key: Word
Times: Integer);
var
i,c,n:Integer;
Key1,Key2,Key3,Key4:Byte;
begin
n:=Length(Str);
if n=0 then exit;
Key4:=Byte((Key div 1000) mod 10);
Key3:=Byte((Key div 100) mod 10);
Key2:=Byte((Key div 10) mod 10);
Key1:=Byte(Key mod 10);
for c:=Times-1 downto 0 do
begin
for i:=1 to n-1 do
Str:=Char(((Byte(Str)-Byte0)-Key2-(Byte(Str[i+1])-Byte0)+20) mod 10+Byte0);
Str[n]:=Char((Byte(Str[n])-Byte0-Key4+10) mod 10+Byte0);
for i:=n downto 2 do
Str:=Char(((Byte(Str)-Byte0)-Key1-(Byte(Str[i-1])-Byte0)+20) mod 10+Byte0);
Str[1]:=Char((Byte(Str[1])-Byte0-Key3+10) mod 10+Byte0);
end;
end;

详见: 双向流式加密算法 http://www.delphibbs.com/keylife/iblog_show.asp?xid=7088
 
多人接受答案了。
 
后退
顶部