Results 1 to 9 of 9

Thread: Delphi naar PHP

  1. #1

    Delphi naar PHP

    Iemand hier met ervaring in php die even kan meekijken met me? Ik heb een oud stukje waar ik een hele simpele licentiecode opbouw met de volgende procedure:
    Delphi Code:
    1. function EncodePWDEx(Data, SecurityString: string; MinV: Integer = 0;
    2.   MaxV: Integer = 5): string;
    3. const
    4.   Codes = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    5. var
    6.   i, x: integer;
    7.   s1, s2, ss: string;
    8. begin
    9.   if minV > MaxV then
    10.   begin
    11.     i := minv;
    12.     minv := maxv;
    13.     maxv := i;
    14.   end;
    15.   if MinV < 0 then MinV := 0;
    16.   if MaxV > 100 then MaxV := 100;
    17.   Result := '';
    18.   if Length(SecurityString) < 16 then Exit;
    19.   for i := 1 to Length(SecurityString) do
    20.   begin
    21.     s1 := Copy(SecurityString, i + 1,Length(securitystring));
    22.     if Pos(SecurityString[i], s1) > 0 then Exit;
    23.     if Pos(SecurityString[i], Codes) <= 0 then Exit;
    24.   end;
    25.   s1 := Codes;
    26.   s2 := '';
    27.   for i := 1 to Length(SecurityString) do
    28.   begin
    29.     x := Pos(SecurityString[i], s1);
    30.     if x > 0 then s1 := Copy(s1, 1,x - 1) + Copy(s1, x + 1,Length(s1));
    31.   end;
    32.   ss := securitystring;
    33.   for i := 1 to Length(Data) do
    34.   begin
    35.     s2 := s2 + ss[Ord(Data[i]) mod 16 + 1];
    36.     ss := Copy(ss, Length(ss), 1) + Copy(ss, 1,Length(ss) - 1);
    37.     s2 := s2 + ss[Ord(Data[i]) div 16 + 1];
    38.     ss := Copy(ss, Length(ss), 1) + Copy(ss, 1,Length(ss) - 1);
    39.   end;
    40.   Result := MakeRNDString(s1, Random(MaxV - MinV) + minV + 1);
    41.   for i := 1 to Length(s2) do Result := Result + s2[i] + MakeRNDString(s1,
    42.       Random(MaxV - MinV) + minV);
    43. end;

    Nu ben ik die "even" aan het herschrijven naar php, omdat dat even nodig is - zodat ik die oude functie netjes in een php kan wegwerken om de boel automatisch te laten gaan. Heb nu al een beter systeem voor licenties, maar deze wordt nog gebruikt in een aantal oudere - en dus nog altijd nodig.

    Mijn php code tot nu toe:
    PHP Code:
    function EncodePWDEx($data$security_string$min_v 0$max_v 5) {
        
    $codes '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        if(
    $min_v $max_v) {
            
    $i          $min_v;
            
    $min_v $max_v;
            
    $max_v $i;
        }
      if(
    $min_v 0) {
          
    $min_v 0;
      } 
      if(
    $max_v 100) {
          
    $max_v 100;
      }
      if(
    strlen($security_string) < 16) return '';
      
    $len strlen($security_string);
      
    $s1  '';
      for (
    $i 0$i $len$i++) { 
          
    $x  $i +1;
          
    $s1 substr($security_string$x$len $x);
          if(
    stripos($s1$security_string[$i]) > 0) {
              return 
    '';
          }
          if(
    stripos($codes$security_string[$i]) <= 0) {
              return 
    '';
          }
      }
      
    $s1  $codes;
      
    $s2  '';
      for (
    $i 0$i $len$i++) { 
          
    $x stripos($security_string[$i], $s1);
          if(
    $x 0) {
              
    $s1 substr($s11$x -1) + substr($s1$x +1strlen($s1));
          }
      }
      
    $ss  $security_string;
      
    $len strlen($data);
      for (
    $i 0$i $len$i++) { 
          
    $s2 .= $ss[ord($data[$i]) % 16 +1];
          
    $ss  substr($ssstrlen($ss), 1) . substr($ss1strlen($ss) -1);
            
    $s2 .= $ss[ord($data[$i]) / 16 +1];
          
    $ss  substr($ssstrlen($ss), 1) . substr($ss1strlen($ss) -1);
      }
      
    $res MakeRNDString($s1rand(0$max_v $min_v) + $min_v +1);
      for (
    $i 0$i strlen($s2); $i++) { 
          
    $res .= $s2[$i] + MakeRNDString($s1rand(0$max_v $min_v) + $min_v +1);
      }
      return 
    $res;

    Alleen loop ik vast - krijg meldingen zoals:
    Code:
    NOTICE String offset cast occurred on line number 51
    NOTICE String offset cast occurred on line number 51
    NOTICE String offset cast occurred on line number 51
    NOTICE String offset cast occurred on line number 51
    NOTICE String offset cast occurred on line number 51
    NOTICE Uninitialized string offset: 13 on line number 49
    Nu de bovenstaande delphi functie heb ik niet zelf gemaakt, ben die ergens tegen gekomen lange tijd geleden - Op zich zou ik al 90% goed moeten hebben van de functie in php, maar ergens doe ik toch iets anders/mis .. iemand die eens wilt/kan meekijken? Bedoeling is dat ik uit beide hetzelfde resultaat kan krijgen.. zodat ik een oud licentiesysteem kan omzetten in de website, en dat niet meer handmatig moet gebeuren, nieuwe programma's werken al met een ander systeem - maar aantal nog op deze "oude"..

    Alvast bedankt voor de hulp

  2. #2
    Was natuurlijk even handig geweest als je gezegd had wat regel 51 en 49 is.

    Verder mis ik de functie MakeRNDString().

    Even gegoogled en ik kan wel onderstaand vinden. Maar dan begint bij mij te knagen of de Random() op Delphi wel hetzelfde terug geeft als op PHP. Als deze niet dezelfde methode hebben om een random getal te bepalen (of uitgaan van een verschillende standaard seed) dan gaat dit natuurlijk nooit hetzelfde opleveren.

    Je kunt even testen of de $s1 en $s2 net voor de aanroep van de eerste MakeRNDString() hetzelfde zijn. Als dit het geval is dan zit je probleem dus in die MakeRNDString.

    (Had je deze overigens al gevonden? Want daar wordt deze functie ook al omgezet in PHP)
    https://stackoverflow.com/questions/...string-encrypt

    Delphi Code:
    1. // this function generate random string using
    2. // any characters from "CHARS" string and length
    3. // of "COUNT" - it will be used in encode routine
    4. // to add "noise" into your encoded data.
    5.  
    6. function MakeRNDString(Chars: string; Count: Integer): string;
    7. var
    8.   i, x: integer;
    9. begin
    10.   Result := '';
    11.   for i := 0 to Count - 1 do
    12.   begin
    13.     x := Length(chars) - Random(Length(chars));
    14.     Result := Result + chars[x];
    15.     chars := Copy(chars, 1,x - 1) + Copy(chars, x + 1,Length(chars));
    16.   end;
    17. end;

  3. #3
    Mijn makernd functie ziet er zo uit:
    PHP Code:
    function MakeRNDString($chars$cnt) {
        
    $len strlen($chars);
      
    $res '';
        for (
    $i 0$i $cnt$i++) { 
            
    $res .= $chars[rand(0$len 1)];
        }
        return 
    $res;

    En je hebt gelijk - regel 49 en 51 zijn deze regels:
    PHP Code:
     49. $s2 .= $ss[ord($data[$i]) % 16 +1];
     
    50. $ss  substr($ssstrlen($ss), 1) . substr($ss1strlen($ss) -1);
     
    51. $s2 .= $ss[ord($data[$i]) / 16 +1];
     
    52. $ss  substr($ssstrlen($ss), 1) . substr($ss1strlen($ss) -1); 
    (Had je deze overigens al gevonden? Want daar wordt deze functie ook al omgezet in PHP)
    https://stackoverflow.com/questions/...string-encrypt
    Dankjewel!!! die had ik nog niet gevonden!! Daarmee is t inderdaad opgelost dankjewel
    Last edited by Reidinga; 07-Dec-18 at 16:40.

  4. #4
    Je kunt die van stackoverflow grotendeels overnemen en even kijken naar het commentaar in het antwoord (en dat ook nog aanpassen).

    Dan blijft alleen de vraag over of rand() in PHP exact hetzelfde doet als Random() in Delphi (en ook elke keer dezelfde getallen geeft).

  5. #5
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by rvk View Post
    Dan blijft alleen de vraag over of rand() in PHP exact hetzelfde doet als Random() in Delphi (en ook elke keer dezelfde getallen geeft).
    In het kort: nee.

    Iedere random functie is per compiler anders en geeft een ander resultaat van "Randomness".
    Ik heb in het verleden iets aan de hand gehad met een vertaling van Visual C naar Delphi en
    heb uiteindelijk een lookup-tabel moeten gebruiken omdat een 1:1 vertaling niet werkte.
    TMemoryLeak.Create(Nil);

  6. #6
    Ik zat net ook even naar de DecodePWDEx te kijken. Maar schijnbaar wordt daar niets met Random() gedaan. Dus de kans bestaat dat daar de random gegevens gestript worden en niet van belang zijn. Ik dat geval maakt het niet uit hoe random gemaakt wordt en zou DecodePWDEx toch gewoon kunnen werken in PHP

  7. #7
    Inderdaad - die randomstring werd enkel gebruikt om een randomkey te maken die vervolgens onderdeel is van de Encode functie, die doet in de functie zelf eigenlijk dus niks.. Althans zover ik zie;

  8. #8
    Het is dan echter niet mogelijk om exact dezelfde encrypted wachtwoorden te krijgen als in Delphi maar de DecodePWDEx zou de wachtwoorden gemaakt in Delphi (en PHP) wel moeten kunnen decoderen. Dus maak een paar encoded wachtwoorden aan in Delphi en kijk of ze in PHP er weer netjes uitkomen.

  9. #9
    Heb ik inderdaad gedaan, en dat werkt perfect

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •