阳光刺痛双眼却未散去悲伤 發表於 2008-10-8 19:03:57

总结一些加密算法

有一些是之前学破解写注册机时写的,一些是我改写某些兄弟的代码来的,写的不好多多指教:
<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 &lt;&gt;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&lt;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 &lt;&gt; 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&lt;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&lt;&gt;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&lt;&gt;(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&lt;&gt;j) and (i&lt;&gt;k) and (j&lt;&gt;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) &lt; $20) or (ord(Name) &gt; $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) &lt;&gt; $20) then strC := strC   strB;
<br />if length(strC) &lt; 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) &lt; 5 then   //如果:注册名长度小于5位数
<br />    begin
<br />    showmessage('注册名的长度必须大于4位数!');
<br />    exit;
<br />    end;
<br />
<br />    //如果:注册名长度大于等于5位数,小于等于9位数
<br />    if (5 &lt;= length(Name)) and (length(Name) &lt;= 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) &gt; 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)&lt;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]
查看完整版本: 总结一些加密算法