www.pudn.com > at.rar > BWCRT.pas


unit BWCRT; 
 
interface 
 
uses 
  SysUtils, StrUtils ; 
 
  //加密函数 
  function Encrypt(const S: String; Key: String): String; 
  //解密函数 
  function Decrypt(const S: String; Key: String): String; 
 
  //字符串转换成十六进制的字符串 
  function StrToHex(AStr: String): String; 
  //把十六进制的字符串还原 
  function HexToStr(AStr: String): String; 
 
  //此函数是用来把16进制的字符,转换成十进制的数字 
  function TransChar(AChar: Char): Integer; 
  //调换一串字符串中的字符位置 
  function ChangePlace(Astr: string): string; 
  //把密码字符转换成密码数字 
  function NumericPassword(Password: String): LongInt; 
  //求次幂 
  function BWPower(Base: Longint; exponent: Longint): LongInt; 
  //随机生成一串字符串 
  function RandGetStr(Num:Byte):string; 
 
const 
  C1 = 52845; 
  C2 = 22719; 
  MIN_ASC = 32; //Space 
  MAX_ASC = 126; //~ 
  NUM_ASC = MAX_ASC - MIN_ASC + 1; 
 
implementation 
 
///////////////////////////////////////////////////////// 
//函数名:RandGetStr 
//说  明:此函数是用来随机生成一串字符串 
//参  数: 
//      1、Num:字符数量 
//返回值:string 
//作  者:卞  伟   2003.6 
///////////////////////////////////////////////////////// 
function RandGetStr(Num:Byte):string; 
var 
  I: Byte; 
begin 
  Result:= ''; 
  for I:= 1 to Num do 
  begin 
    Randomize; 
    Result:= Result + Chr(Random(93) + 33); 
  end; 
end; 
 
///////////////////////////////////////////////////////// 
//函数名:BWPower 
//说  明:此函数是用来求一个长整数的n次方的。 
//参  数: 
//      1、Base:Longint  基数 
//      2、exponent: Longint 次方 
//返回值:Long 长整型,返回n次方的值 
//作  者:卞  伟   2002.3 
///////////////////////////////////////////////////////// 
function BWPower(Base: Longint; exponent: Longint): LongInt; 
var 
  I: Longint; 
begin 
  Result:= 1; 
  for I:= 1 to exponent do 
    Result:= Result * Base; 
end; 
 
///////////////////////////////////////////////////////// 
//函数名:StrToHex 
//说  明:此函数是用来把一串字符串转换成十六进制一串数字字符串 
//参  数: 
//      1、AStr:string  源字符 
//返回值:PChar 返回转换后的字符串 
//作  者:卞  伟   2002.3 
///////////////////////////////////////////////////////// 
function StrToHex(AStr: String): String; 
var 
  I : Integer; 
  Temp: String; 
begin 
  Temp := ''; 
  For I := 1 to Length(AStr) do 
  begin 
    Temp := Temp + Format('%2x', [Byte(AStr[I])]); 
  end; 
  I := Pos(' ', Temp); 
  While I <> 0 do 
  begin 
    Temp[I] := '0'; 
    I := Pos(' ', Temp); 
  end; 
//  Result:= PChar(Temp); 
  Result:= Temp; 
end; 
 
///////////////////////////////////////////////////////// 
//函数名:HexToStr 
//说  明:此函数是用来把一串十六进制数字字符串还原 
//参  数: 
//      1、AStr:string  十六进制数字字符串 
//返回值:PChar 返回转换后的字符串 
//作  者:卞  伟   2002.3 
///////////////////////////////////////////////////////// 
function HexToStr(AStr: String): String; 
var 
  I : Integer; 
  CharValue: Word; 
  Temp: String; 
begin 
  Temp := ''; 
  For I := 1 to Trunc(Length(Astr)/2) do 
  begin 
    Temp := Temp + ' '; 
    CharValue := TransChar(AStr[2*I-1])*16 + TransChar(AStr[2*I]); 
    Temp[I] := Char(CharValue); 
  end; 
//  Result:= PChar(Temp); 
  Result:= Temp; 
end; 
 
///////////////////////////////////////////////////////// 
//函数名:TransChar 
//说  明:此函数是用来把16进制的字符,转换成十进制的数字 
//参  数: 
//      1、AChar:Char  源字符 
//返回值:Integer 返回数值 
//作  者:卞  伟   2002.3 
///////////////////////////////////////////////////////// 
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; 
 
///////////////////////////////////////////////////////// 
//函数名:ChangePlace 
//说  明:调换一串字符串中的字符位置 
//参  数: 
//      1、Astr:string  源字符 
//返回值:string 返回数值 
//作  者:卞  伟   2002.3 
///////////////////////////////////////////////////////// 
function ChangePlace(Astr: string): string; 
var 
  I: Integer; 
begin 
  //把字符串中第1个和第3个字符的位置倒置,第2个和第4个的位置倒置 
  result:=Astr; 
 
  I:= 4; 
  while I < Length(Astr) do 
  begin 
    result[I - 3] := Astr[I - 1]; 
    result[I - 1] := Astr[I - 3]; 
    result[I - 2] := Astr[I]; 
    result[I] := Astr[I - 2]; 
    I:= I + 4; 
  end; 
 
  if Length(Astr) mod 4 = 3 then 
  begin 
    result[Length(Astr)] := Astr[Length(Astr) - 1]; 
    result[Length(Astr) - 1] := Astr[Length(Astr)]; 
  end; 
end; 
 
///////////////////////////////////////////////////////// 
//函数名:NumericPassword 
//说  明:此函数是用来把密码字符串转换成密码数字。 
//参  数: 
//      1、Password:String  密码字符串 
//返回值:Long 长整型,密码数字。 
//作  者:卞  伟   2002.3 
///////////////////////////////////////////////////////// 
function NumericPassword(Password: String): LongInt; 
var 
  Shift1,Shift2: LongInt; 
  Ch,I,Str_Len: Integer; 
begin 
  Shift1:= 0; 
  Shift2:= 0; 
  Result:= 0; 
  Str_Len := Length(Password); 
  for I:= 1 to Str_Len do 
  begin 
    ch := Byte(Password[I]); 
    Result := Result xor (ch * BWPower(2,Shift1)); 
    Result := Result xor (ch * BWPower(2,Shift2)); 
    Shift1 := (Shift1 + 7) mod 19; 
    Shift2 := (Shift2 + 13) mod 23; 
  end; 
end; 
 
///////////////////////////////////////////////////////// 
//函数名:Encrypt 
//说  明:此函数提供给外接程序所用的加密函数 
//参  数: 
//      1、S:String  需要加密的字符串 
//      2、Key: String  密码字符串 
//返回值:加密后的字符串 
//作  者:卞  伟   2002.3 
///////////////////////////////////////////////////////// 
function Encrypt(const S: String; Key: String): String; 
var 
  I : Integer; 
  NumKey: LongInt; 
  Temp: String; 
begin 
  NumKey:= NumericPassword(Key);  //把字符串Key转换成密码数字 
  Temp := S; 
  for I := 1 to Length(S) do 
  begin 
    Temp[I] := char(byte(S[I]) xor (NumKey shr 8)); 
    NumKey := (byte(Temp[I]) + NumKey) * C1 + C2; 
    if Temp[I] = Chr(0) then 
      Temp[I] := S[I]; 
  end; 
 
  Temp := StrToHex(Temp);     //转换成十六进制的字符串 
  Temp := ChangePlace(Temp);  //调换字符位置 
 
//  Result:= PChar(Temp); 
  Result:= Temp; 
end; 
 
///////////////////////////////////////////////////////// 
//函数名:Decrypt 
//说  明:此函数提供给外接程序所用的解密函数 
//参  数: 
//      1、S:String  需要解密的字符串 
//      2、Key: String  密码字符串 
//返回值:解密后的字符串 
//作  者:卞  伟   2002.3 
///////////////////////////////////////////////////////// 
function Decrypt(const S: String; Key: string): string; 
var 
  I: Integer; 
  Temp: String; 
  NumKey: LongInt; 
  Resu: String; 
begin 
  NumKey:= NumericPassword(Key);  //把字符串Key转换成密码数字 
 
  Temp:= ChangePlace(S);    //调换字符位置 
  Temp:= HexToStr(Temp);       //把十六进制的数字字符串还原 
  Resu := Temp; 
 
  for I := 1 to Length(Temp) do 
  begin 
    if char(byte(Temp[I]) xor (NumKey shr 8)) = Chr(0) then 
    begin 
      Resu[I] := Temp[I]; 
      NumKey := (byte(Chr(0)) + NumKey) * C1 + C2; //保证Key的正确性 
    end else 
    begin 
      Resu[I] := char(byte(Temp[I]) xor (NumKey shr 8)); 
      NumKey := (byte(Temp[I]) + NumKey) * C1 + C2; 
    end; 
  end  ; 
 
//  Result:= PChar(Resu); 
  Result:= Resu; 
end; 
 
end.