总结一些加密算法
有一些是之前学破解写注册机时写的,一些是我改写某些兄弟的代码来的,写的不好多多指教:<br />
<br />{=======================================================
<br /> 学习破解,写注册机的一些函数集
<br /> By:黑夜彩虹
<br />========================================================}
<br />function wzwgp(s: string): string; //取累加值
<br />var i,sum:integer;
<br />begin
<br /> sum:=0; for i:=1 to length(s) do
<br />begin
<br /> sum:=sum ord(s);
<br />end;
<br /> Result :=inttostr(sum);
<br />end;
<br />
<br />function ASCII10ADD(s: string): string; //取累加值
<br />var i,sum:integer;
<br />begin
<br /> sum:=0; for i:=1 to length(s) do
<br />begin
<br /> sum:=sum ord(s);
<br />end;
<br /> Result :=inttostr(sum);
<br />end;
<br />
<br />function ASCII16ADD(s: string): string; //取累加值
<br />var i,sum:integer;
<br />begin
<br /> sum:=0; for i:=1 to length(s) do
<br />begin
<br /> sum:=sum ord(s);
<br />end;
<br /> Result :=inttohex(sum,2);
<br />end;
<br />
<br />function float( a:integer ):string;
<br />var i:integer;
<br />s:Extended;
<br />begin
<br />s:=0;
<br />i:=1;
<br />for i:=1 to a do
<br />begin
<br /> s:=s 1/i;
<br />end;
<br />result:=FloatToStr(s);
<br />end;
<br />
<br />function float2( a:integer ):string; //浮点数学运算
<br />var i:integer;
<br />s:Extended;
<br />begin
<br />s:=0;
<br />i:=1;
<br />for i:=1 to a do
<br />begin
<br /> if i mod 2 <>0 then
<br /> s:=s 1/i
<br /> else
<br /> s:=s - 1/i;
<br />end;
<br />result:=FloatToStr(s);
<br />end;
<br />
<br />procedure TForm1.Button2Click(Sender: TObject);
<br />begin
<br />
<br /> edit2.text:=float2(100);
<br />end;
<br />{ }
<br />
<br />function StrToBack(s: string): string; //将字符串倒转过来
<br />var i:integer;
<br />begin
<br /> for i:=1 to length(s) do
<br /> begin
<br /> result :=s result;
<br /> end;
<br />end;
<br />
<br />{ }
<br />
<br />function mdistr(str:string;int:integer):string; //取字符串的中间部份
<br />begin
<br />if int<Length(str)div 2 then
<br />result:=copy(str,length(str) div 2,int)
<br />else
<br />result:=copy(str,Length(str)div 2-(int-Length(str)div 2),int);
<br />end;
<br />
<br />{ }
<br />
<br />function StrToASCII16(s: string): string; //字符串转换ascii码16进制
<br />var i:integer;
<br />begin
<br /> for i:=1 to length(s) do
<br /> begin
<br /> result := result IntToHex(ord(s),2);
<br /> end;
<br />end;
<br />
<br />{ }
<br />
<br />function StrToASCII10(s: string): string; //字符串转换ascii码10进制
<br />var i:integer;
<br />begin
<br /> for i:=1 to length(s) do
<br /> begin
<br /> result:= result inttostr(ord(s));
<br /> end;
<br />end;
<br />
<br />{ }
<br />
<br />function StrToASCII16(s: string): string; //字符串转换ascii码16进制,
<br />var i:integer; // 如:黑夜彩虹=$BA,$DA,$D2,$B9,$B2,$CA,$BA,$E7
<br />begin
<br /> for i:=1 to length(s) do
<br /> begin
<br /> result := result'$'IntToHex(ord(s),2) ',';
<br /> end;
<br /> Result:=copy(Result,0,Length(result)-1);
<br />end;
<br />
<br />{ }
<br />function DoubleStr(Str: string): string; //取字符串偶位数字符
<br />var
<br />i: Integer;
<br />begin
<br /> Result := '';
<br /> for i := 2 to Length(Str) do
<br /> if i mod 2 = 0 then
<br /> Result := Result Str;
<br />end;
<br />
<br />{ }
<br />
<br />function WideStr(str:string):String; //取出字符串中的汉字
<br />var I: Integer;
<br />begin
<br /> for I := 1 to Length(WideString(Str)) do
<br /> if Length(string(WideString(Str))) = 2 then
<br /> result:= result WideString(Str);
<br />end;
<br />
<br />{ }
<br />
<br />function StrSubCount(const Source,Sub:string):integer; //判断某字符在字符串中的个数
<br />var Buf:string;
<br /> Len,i:integer;
<br />begin
<br /> Result:=0;
<br /> Buf:=Source;
<br /> i:=Pos(Sub, Buf);
<br /> Len:=Length(Sub);
<br />while i <> 0 do
<br /> begin
<br /> Inc(Result);
<br /> Delete(Buf,1,i Len-1);
<br /> i:=Pos(Sub,Buf);
<br />end;
<br />end;
<br />
<br />{ }
<br />
<br />function ByteToHex(Src: Byte): String;
<br />begin
<br />SetLength(Result, 2);
<br />asm
<br /> MOV EDI,
<br /> MOV EDI,
<br /> MOV AL, Src
<br /> MOV AH, AL // Save to AH
<br /> SHR AL, 4 // Output High 4 Bits
<br /> ADD AL, '0'
<br /> CMP AL, '9'
<br /> JBE @@OutCharLo
<br /> ADD AL, 'A'-'9'-1
<br />@@OutCharLo:
<br /> AND AH, $f
<br /> ADD AH, '0'
<br /> CMP AH, '9'
<br /> JBE @@OutChar
<br /> ADD AH, 'A'-'9'-1
<br />@@OutChar:
<br /> STOSW
<br />end;
<br />end;
<br />
<br />{ }
<br />
<br />function ShiftStr(str1,str2:string):string; //移位字符串
<br />var i:integer;
<br />begin
<br /> Result:='';
<br /> for i:=1 to length(str1) do
<br /> begin
<br /> Result:=Result str1 str2;
<br /> end;
<br />end;
<br />
<br />function SiftStr(Str: string): string; //过滤字符串
<br />var i,j:integer;
<br />begin
<br /> Result:='';
<br /> j:=Length(str);
<br /> for i:=0 to j do
<br /> begin
<br /> if str in ['0'..'9','a'..'f','A'..'F'] then
<br /> Result:=Result str;
<br /> end;
<br />end;
<br />
<br />function IsNum(str:string;int,int2:integer): string;
<br />var i:integer;
<br />begin
<br /> for i:=1 to length(str) do
<br /> begin
<br /> result := inttostr((StrToInt('$' str) or int) mod int2) result;
<br /> end;
<br />end;
<br />
<br />{ }
<br />function OpeateStr(const s :string): string; //字符逐位 xor 运算
<br /> const
<br /> snLen = 5 ;
<br /> sn:array of Integer =($0D, $01, $14, $05,$02);
<br /> var
<br /> i,n: integer;
<br /> begin
<br /> setLength(result,Length(s));
<br /> for i :=1 to Length(s) do begin
<br /> n := i mod snLen ;
<br /> if n = 0 then
<br /> n := 5 ;
<br /> result := char(ord(s) xor sn);
<br /> end;
<br />end;
<br />
<br />{ }
<br />
<br />function StrToEncrypt(Str,ID,Pass:string): string; //销售王进销存_keygen算法
<br />var
<br />username: string;
<br />a, b, c_str, c_hex, d, e, f: string;
<br />I, a_len: Integer;
<br />begin
<br /> username:=str;
<br /> a:=id str;
<br /> //b:= 'MraketSoft62095231';
<br /> b:=pass;
<br /> a_len := Length(a);
<br />c_str := '';
<br />c_hex := '';
<br />for I := 1 to a_len do
<br />begin
<br /> c_hex := c_hex IntToHex(Byte(a) xor Byte(b), 2) ' ';
<br /> c_str := c_str Chr(Byte(a) xor Byte(b));
<br />end;
<br />d := '';
<br />for I := 1 to Length(c_str) do
<br />begin
<br /> if Byte(c_str) in [$01..$09,$0A..$0F] then
<br /> d := d QuotedStr('#$' IntToHex(Byte(c_str), 1))
<br /> else d := d c_str;
<br />end;
<br />d := '''' d '''';
<br />e := '';
<br />for I := 1 to Length(d) do
<br />begin
<br /> if d in ['0'..'9','a'..'z','A'..'Z'] then e := e d;
<br />end;
<br />f := '';
<br />for I := 1 to Length(e) do
<br />begin
<br /> f := f e;
<br /> if (I mod 4 = 0)and(I<Length(e)){避免注册码正好是4的倍数时,最后一组加横线} then
<br /> f := f '-';
<br />end;
<br />Result:=f;
<br />end;
<br />{ }
<br />function myStrtoHex(s: string): string; //原字符串转16进制字符串
<br />var tmpstr:string;
<br /> i:integer;
<br />begin
<br /> tmpstr := '';
<br /> for i:=1 to length(s) do
<br /> begin
<br /> tmpstr := tmpstr inttoHex(ord(s),2);
<br /> end;
<br /> result := tmpstr;
<br />end;
<br />
<br />function myHextoStr(S: string): string; //16进制字符串转原字符串
<br />var hexS,tmpstr:string;
<br /> i:integer;
<br /> a:byte;
<br />begin
<br /> hexS :=s;//应该是该字符串
<br /> if length(hexS) mod 2=1 then
<br /> begin
<br /> hexS:=hexS '0';
<br /> end;
<br /> tmpstr:='';
<br /> for i:=1 to (length(hexS) div 2) do
<br /> begin
<br /> a:=strtoint('$' hexS hexS);
<br /> tmpstr := tmpstr chr(a);
<br /> end;
<br /> result :=tmpstr;
<br />end;
<br />
<br />function encryptstr(const s:string; skey:string):string; //异或运算加密
<br />var
<br /> i,j: integer;
<br /> hexS,hexskey,midS,tmpstr:string;
<br /> a,b,c:byte;
<br />begin
<br /> hexS :=myStrtoHex(s);
<br /> hexskey:=myStrtoHex(skey);
<br /> midS :=hexS;
<br /> for i:=1 to (length(hexskey) div 2) do
<br /> begin
<br /> if i<>1 then midS:= tmpstr;
<br /> tmpstr:='';
<br /> for j:=1 to (length(midS) div 2) do
<br /> begin
<br /> a:=strtoint('$' midS midS);
<br /> b:=strtoint('$' hexskey hexskey);
<br /> c:=a xor b;
<br /> tmpstr := tmpstr myStrtoHex(chr(c));
<br /> end;
<br /> end;
<br /> result := tmpstr;
<br />end;
<br />
<br />function decryptstr(const s:string; skey:string):string; //异或运算解密
<br />var
<br /> i,j: integer;
<br /> hexS,hexskey,midS,tmpstr:string;
<br /> a,b,c:byte;
<br />begin
<br /> hexS :=s;//应该是该字符串
<br /> if length(hexS) mod 2=1 then
<br /> begin
<br /> showmessage('密文错误!');
<br /> exit;
<br /> end;
<br /> hexskey:=myStrtoHex(skey);
<br /> tmpstr :=hexS;
<br /> midS :=hexS;
<br /> for i:=(length(hexskey) div 2) downto 1 do
<br /> begin
<br /> if i<>(length(hexskey) div 2) then midS:= tmpstr;
<br /> tmpstr:='';
<br /> for j:=1 to (length(midS) div 2) do
<br /> begin
<br /> a:=strtoint('$' midS midS);
<br /> b:=strtoint('$' hexskey hexskey);
<br /> c:=a xor b;
<br /> tmpstr := tmpstr myStrtoHex(chr(c));
<br /> end;
<br /> end;
<br /> result := myHextoStr(tmpstr);
<br />end;
<br />
<br />
<br />//调用
<br />Edit2.Text :=encryptstr(Edit1.Text,Editkey.Text);
<br />
<br />
<br />{ }
<br />// XOR 加密/解密
<br />function XorEncDec(AStr:String;Key:Byte):String;
<br />var
<br />i,n:Integer;
<br />begin
<br />n:=Length(AStr);
<br />SetLength(Result,n);
<br />for i:=1 to n do
<br /> Result:=Char(Byte(AStr) xor Key);
<br />end;
<br />//加法加密
<br />function AddEnc(AStr:String;Key:Byte):String;
<br />var
<br />i,n:Integer;
<br />begin
<br />n:=Length(AStr);
<br />SetLength(Result,n);
<br />for i:=1 to n do
<br /> Result:=Char(Byte(AStr) Key);
<br />end;
<br />//加法解密
<br />function AddDec(AStr:String;Key:Byte):String;
<br />var
<br />i,n:Integer;
<br />begin
<br />n:=Length(AStr);
<br />SetLength(Result,n);
<br />for i:=1 to n do
<br /> Result:=Char(Byte(AStr)-Key);
<br />end;
<br />
<br />其中XorEncDec的加密/解密均为同一个过程,而加法加密、解密则需要两个过程配套使用。
<br />
<br />
<br />procedure TForm1.Button1Click(Sender: TObject);
<br />begin
<br />Edit2.Text:=XorEncDec(Edit1.Text,123); //加密(Edit1中存放明文,Edit2存放密文)
<br />end;
<br />procedure TForm1.Button2Click(Sender: TObject);
<br />begin
<br />Edit1.Text:=XorEncDec(Edit2.Text,123); //解密(Edit2存放密文,Edit1中存放解密的明文)
<br />end;
<br />
<br />//====================================================
<br />//题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
<br />function permutation( int:integer ):string;
<br />var
<br />i,j,k:integer;
<br />begin
<br />for i:=1 to int do
<br />for j:=1 to int do
<br />for k:=1 to int do
<br />begin
<br />if (i<>j) and (i<>k) and (j<>k)then
<br />result:=result inttostr(i) inttostr(j) inttostr(k) #13 #10;
<br />end;
<br />end;
<br />
<br />procedure TForm1.Button1Click(Sender: TObject);
<br />begin
<br /> Memo1.Clear;
<br /> Memo1.Lines.Add(permutation(4));
<br /> label1.Caption:=inttostr(memo1.Lines.Count);
<br />end;
<br />
<br />//=============================收集函数
<br />function acafeel(Name:string):string;
<br />var
<br />strA,strB, strC : string;
<br />sum, pos : integer;
<br />begin
<br />if Name ='' then exit;
<br />for pos := 1 to length(Name) do
<br /> if (ord(Name) < $20) or (ord(Name) > $7E) then
<br /> begin
<br /> showmessage('请输入字母或者数字,不支持中文!');
<br /> exit;
<br /> end;
<br />sum := ord(Name) * length(Name) * $64;
<br />strA := ' ' intTostr(sum) 'NoName SwordMan nOnAME';
<br />strB := strA[$12] (strA[$7] strA[$8]) strA[$9] strA[$5] strA[$3]
<br /> strA[$1] (strA[$14] strA[$15] strA[$16] strA[$17] strA[$18])
<br /> (strA[$D] strA[$E]) strA[$8];
<br />for pos := 1 to length(strB) do
<br /> if (ord(strB) <> $20) then strC := strC strB;
<br />if length(strC) < 14 then
<br /> begin
<br /> strC := strC copy(strA, 7, 23);
<br /> strC := copy(strC, 1, 15) 'bywjy';
<br /> end;
<br />Result := copy(strC, 1, 5) '-' copy(strC, 5, 4) '-' copy(strC, 8, 4)
<br /> '-' copy(strC, 11, 4) '-' copy(strC, 14, 7);
<br />end;
<br />
<br />function acafeel2(Name:string):string;
<br />var
<br />temp1, temp2, temp3,
<br />tempA, tempB, tempC1, tempC2, tempD1, tempD2,
<br />pos, posSTR, posADD, posSUB : integer;
<br />begin
<br /> if length(Name) < 5 then //如果:注册名长度小于5位数
<br /> begin
<br /> showmessage('注册名的长度必须大于4位数!');
<br /> exit;
<br /> end;
<br />
<br /> //如果:注册名长度大于等于5位数,小于等于9位数
<br /> if (5 <= length(Name)) and (length(Name) <= 9) then
<br /> begin
<br /> {大循环1}//////////////////////////////////////////////////{大循环1}
<br /> // Name := EditName.Text;
<br /> //第一次
<br /> temp1 := ((ord(Name) $56B) xor $890428) $18;
<br /> temp2 := ((ord(Name) length(Name)) xor $54) xor $25D;
<br /> temp3 := (ord(Name) $56B) * $1024;
<br /> tempA := ((temp1 * temp2) $400) temp3 ;
<br /> //第二次开始循环
<br /> for pos := 2 to length(Name) do
<br /> begin//取字符的ASCII码
<br /> temp1 := temp1 ((ord(Name) $56B) xor $890428);
<br /> temp2 := ((ord(Name) length(Name)) xor $54) xor $25D;
<br /> temp3 := (ord(Name) $56B) * $1024;
<br /> tempA := tempA (temp1 * temp2) temp3;
<br /> end;
<br /> end;
<br />
<br /> if length(Name) > 9 then //如果:注册名长度大于9位数
<br /> begin
<br /> {大循环1}//////////////////////////////////////////////////{大循环1}
<br /> // Name := EditName.Text;
<br /> //第一次
<br /> temp1 := ((ord(Name) $56B) xor $890428) $18;
<br /> temp2 := (((ord(Name) length(Name)) xor $54) xor $25D) * $400;
<br /> temp3 := ((ord(Name) $56B) * $1024) $400;
<br /> tempA := temp3;
<br /> //第二次开始循环
<br /> for pos := 2 to length(Name) do
<br /> begin//取字符的ASCII码
<br /> temp1 := temp1 temp2 ((ord(Name) $56B) xor $890428);
<br /> temp2 := (((ord(Name) length(Name)) xor $54) xor $25D) * temp3;
<br /> temp3 := temp3 ((ord(Name) $56B) * $1024);
<br /> tempA := temp3;
<br /> end;
<br /> temp1 := temp1 temp2;
<br /> end;
<br />
<br /> {小循环1}//////////////////////////////////////////////////{小循环1}
<br /> // Name := EditName.Text;
<br /> //第一次
<br /> tempB := ord(Name) $32 $134A;////
<br /> {字符串反顺序}//比如开始:aCaFeeL
<br /> for posSTR := length(Name) downto 1 do
<br /> begin
<br /> Name := Name Name;
<br /> end;
<br /> posSTR := length(Name) div 2;
<br /> Name := copy(Name, posSTR 1, posSTR);
<br /> {字符串反顺序}//比如结束:LeeFaCa
<br /> //第二次开始循环
<br /> for pos := 4 downto 1 do
<br /> begin
<br /> tempB := tempB ord(Name) $134A;////
<br /> {字符串反顺序}
<br /> for posSTR := length(Name) downto 1 do
<br /> begin
<br /> Name := Name Name;
<br /> end;
<br /> posSTR := length(Name) div 2;
<br /> Name := copy(Name, posSTR 1, posSTR);
<br /> {字符串反顺序}
<br /> end;
<br />
<br /> {小循环2}//////////////////////////////////////////////////{小循环2}
<br /> //第一次
<br /> tempC1 := ord(Name) tempB $134A;
<br /> tempC2 := ((ord(Name) $23) * $25A) temp1;
<br /> //第二次开始循环
<br /> posADD := 2;
<br /> for pos := 4 downto 1 do
<br /> begin
<br /> posADD := posADD 1;
<br /> tempC1 := tempC1 ord(Name) $134A;
<br /> tempC2 := tempC2 ((ord(Name) $23) * $25A);
<br /> if (posADD = 4) or (posADD = 5) then
<br /> begin
<br /> {字符串反顺序}
<br /> for posSTR := length(Name) downto 1 do
<br /> begin
<br /> Name := Name Name;
<br /> end;
<br /> posSTR := length(Name) div 2;
<br /> Name := copy(Name, posSTR 1, posSTR);
<br /> {字符串反顺序}
<br /> end;
<br /> end;
<br />
<br /> {最后检测}//////////////////////////////////////////////////{最后检测}
<br /> // Name := EditName.Text;
<br /> tempD1 := (tempC2 $3C) xor ($1337 - ord(Name));
<br /> tempD2 := (tempC1 tempA) xor ($18 - ord(Name));
<br /> Result:= 'RHM' '-' inttostr(tempD1) inttostr(tempD2);
<br />end;
<br />
<br />
<br />//======================johnroot写的注册机改写(不懂算法的CM)
<br />function johnroot(Name:string):string;
<br />var
<br />nameok,gg,gg2,mm,mm2:pchar;
<br />i,j,j2,k:integer;
<br />begin
<br />getmem(nameok,$10);
<br />ZeroMemory(nameok,$10);
<br />getmem(mm,5);
<br />ZeroMemory(mm,5);
<br />getmem(mm2,5);
<br />ZeroMemory(mm2,5);
<br />
<br />for i:=0 to (length(name)-1) do
<br />begin
<br />nameok:=Name;
<br />end;
<br />
<br />j:=0;
<br />for i:=0 to $f do
<br />begin
<br /> k:=ord(nameok) xor $82;
<br /> j:=j k;
<br />end;
<br />gg := pchar(inttostr(j));
<br />
<br />j:=0;
<br />for i:=0 to $f do
<br />begin
<br /> k:=ord(nameok) xor $28;
<br /> j2:=j2 k;
<br />end;
<br />gg2 := pchar(inttostr(j2));
<br />if length(gg2)<4 then
<br />begin
<br />gg2:=pchar('0' string(gg2));
<br />end;
<br />
<br />for i:=0 to 3 do
<br />begin
<br /> mm:= char($69 - ord(gg));
<br />end;
<br />
<br />for i:=0 to 3 do
<br />begin
<br /> mm2:= char($69 - ord(gg2));
<br />end;
<br />Result:=string(gg) string(gg2) string(mm) string(mm2);
<br />end;
<br />
頁:
[1]