📄 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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -