Page 1 of 3 1 2 3 LastLast
Results 1 to 15 of 31

Thread: Decrypt string from PHP met DCPCrypt

  1. #1

    Decrypt string from PHP met DCPCrypt

    Ik probeer met Lazarus een String te ontsleutelen welke met PHP versleuteld is.

    De PHP code ziet er als volgt uit:

    Code:
    if(!function_exists("my_encrypt")) {
    	function my_encrypt($data, $key)
    	{
    // Remove the base64 encoding from our key
    		$encryption_key = base64_decode($key);
    // Generate an initialization vector
    		$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-CBC'));
    // Encrypt the data using AES 256 encryption in CBC mode using our encryption key and initialization vector.
    		$encrypted = openssl_encrypt($data, 'AES-256-CBC', $encryption_key, 0, $iv);
    // The $iv is just as important as the key for decrypting, so save it with our encrypted data using a unique separator (::)
    		return base64_encode($encrypted . '::' . $iv);
    	}
    }
    De $key variabele is een constante en ook in het Lazarus programma bekend.
    De IV (initialisatie Vektor) wordt achter de versleutelde string aangeplakt en gescheiden door ::

    De versleutelde string is opgelagen in een MySQL database en deze wordt door Lazarus uitgelezen via .ZEOS.

    Hieronder de code voor de ontsleuteling:

    Code:
      function my_decrypt(data:string; key:string) : String;
      var
        index, dataLength, bsize, pad: integer;
        datarr : TArrayOfString;
        Cipher : TDCP_rijndael;
        decryptedstr : String;
        DataString, encryption_key, IV : AnsiString;
      begin
           datarr :=  SplitString('::', DecodeStringBase64(data), 2);
           encryption_key := DecodeStringBase64(key);
           IV := datarr[1];
           DataString := datarr[0];
           Cipher := TDCP_rijndael.Create(nil);
           Cipher.Init(encryption_key[1],Length(encryption_key)*8,@IV[1]);
           Cipher.CipherMode:= cmCBC;
    
           Cipher.DecryptCBC(DataString[1],DataString[1],Length(DataString));
           my_decrypt := DataString;
           Cipher.Free;
      end;
    Als ik check in Lazarus, dan klopt de lengte van de IV, de key en de lengte van de ontsleutelde string, echter de string is niet juist ontsleuteld en is onleesbaar.

    Iemand die nog een suggestie heeft?

    Edit: Ontsleutelen binnen PHP gaat wel goed
    Last edited by douwe_yntema; 07-Jan-22 at 16:46. Reason: Add info

  2. #2
    Heb je een voorbeeldje van wat data?

    Hoe groot is je key?
    Is die inderdaad precies 32 characters groot? (32*8=256)

    Anders moet je die key nog zelf even padden:
    Code:
    if (Length(encryption_key) < 32) then
      while Length(encryption_key) < 32 do encryption_key := encryption_key + AnsiChar(0);
    encryption_key := Copy(encryption_key, 1, 32); // for the instance Length(encryption_key) > 32
    Tevens zou de data ook precies een veelvoud van 16 moeten zijn (maar dat zal wel als die al encrypted is).

  3. #3
    Ik heb getest met de door jou voorgestelde padding, maar het resultaat is volgens mij hetzelfde.

    Heb nog even getest op de stringlengte van de gencrypte string, maar deze schijnt altijd 24 of 44 te zijn.

    Hier wat data:

    Oorspronkelijke string:
    Openings balans
    Key = NQ6cnIH98555I85CaZ7TVx6EZv8y4VYr
    Geeft als versleuteld resultaat met PHP:
    LzlEQVJiMUFDa2c2a1JPL3pTa1poZz09OjqANZlDloLA1vYQkv jhLeNc

    En als ik deze ontsleutel met Lazarus:
    m9E?,I??????????):G

  4. #4
    mist de :: in het resultaat niet?

    Edit: laat maar, zie net dat ook de :: wordt meegenomen in de base64 encode van het resultaat.

  5. #5
    Nee, want Lazarus is in staat om de IV hieruit te halen.
    Door de codering zie je die niet

    Zelfde zonder codering: 89RjoQmx/5EnoXetLNGDqQ==::�D"�y��i�n!˜�S�

    En daar is de :: wel

    En anders had de decodering in PHP ook niet gewerkt
    Last edited by douwe_yntema; 07-Jan-22 at 19:06.

  6. #6
    Quote Originally Posted by douwe_yntema View Post
    Zelfde zonder codering: 89RjoQmx/5EnoXetLNGDqQ==::�D"�y��i�n!�S�
    ???
    Als ik
    Code:
    LzlEQVJiMUFDa2c2a1JPL3pTa1poZz09OjqANZlDloLA1vYQkvjhLeNc
    door DecodeStringBase64 haal dan krijg ik
    Code:
    /9DARb1ACkg6kRO/zSkZhg==::?5?C???????-?\
    Hoe geef je overigens die key NQ6cnIH98555I85CaZ7TVx6EZv8y4VYr door?
    Want die is precies 32 bytes.
    Maar als ik die door DecodeStringBase64 haal (wat jij in de code doet) dan krijg ik 5???y#?Bi??W?f?2?V+
    Dat lijkt me geen geldige string van 32 characters.

  7. #7
    in ascii
    Code:
    /9DARb1ACkg6kRO/zSkZhg==::€5™C–‚’-\
    via https://www.base64decode.org/

  8. #8
    De NQ6cnIH98555I85CaZ7TVx6EZv8y4VYr is opgeslagen in de database en die komt binnen in Lazarus. Dat heb ik gecontroleerd dat klopt.
    Vervolgens wordt deze doorgegven aan de functie my_decrypt, en zoals jij al schrijft, door de DecodeStringBase64 in deze regel: datarr := SplitString('::', DecodeStringBase64(data), 2);
    Komt de string er uit zoals jij al aangeeft: /9DARb1ACkg6kRO/zSkZhg==::?5?C???????-?\
    En deze wordt dan gesplitst bij het :: teken in 2 delen.
    Het eerste deel is de versleutelde string, het tweede deel de IV.

    Zo doet PHP het ook:

    if(!function_exists("my_decrypt")) {
    function my_decrypt($data, $key)
    {
    // Remove the base64 encoding from our key
    $encryption_key = base64_decode($key);
    $datarr = [];
    // To decrypt, split the encrypted data from our IV - our unique separator used was "::"
    //$datarr[0] contains encrypted string, ($datarr[1] contains $iv
    $datarr = explode('::', base64_decode($data), 2);
    // No decryption when there is no $iv.
    if (count($datarr) < 2) {
    return $data;
    } else {
    return openssl_decrypt($datarr[0], 'AES-256-CBC', $encryption_key, 0, $datarr[1]);
    // return strlen($datarr[0]);
    }
    }
    }

  9. #9
    Quote Originally Posted by douwe_yntema View Post
    De NQ6cnIH98555I85CaZ7TVx6EZv8y4VYr is opgeslagen in de database en die komt binnen in Lazarus. Dat heb ik gecontroleerd dat klopt.
    Vervolgens wordt deze doorgegven aan de functie my_decrypt, en zoals jij al schrijft, door de DecodeStringBase64 in deze regel: datarr := SplitString('::', DecodeStringBase64(data), 2);
    Wat [rvk] bedoelt is na de decode van de key blijft
    Code:
    5y#BiWf2V+
    over, dat lijkt een ongeldige key en tevens niet van de correcte lengte. Dus moet de key gepad worden om op 256 bit uit te komen
    Code:
    Cipher.Init(encryption_key[1],Length(encryption_key)*8,@IV[1]);
    moet namelijk eigenlijk
    Code:
    Cipher.Init(encryption_key[1],256,@IV[1]);
    opleveren

  10. #10
    Quote Originally Posted by douwe_yntema View Post
    De NQ6cnIH98555I85CaZ7TVx6EZv8y4VYr is opgeslagen in de database en die komt binnen in Lazarus. Dat heb ik gecontroleerd dat klopt.
    function my_decrypt($data, $key)
    {
    // Remove the base64 encoding from our key
    $encryption_key = base64_decode($key);
    Ja, maar wat geef je als key op?
    Je doet daar ook een $encryption_key = base64_decode($key);
    Dus dan moet je wel zeker weten dat daar een ascii string van 32 characters uitkomt.
    (en dat is volgens mij bij NQ6cnIH98555I85CaZ7TVx6EZv8y4VYr niet het geval. Die is maar 24 chars en heeft rare tekens.)

  11. #11
    en de data na decrypt moet volgens mij nog op padding gecheckt worden en indien nodig moet die padding verwijderd worden.

    PS en IV moet 16 bytes zijn
    Last edited by Miep; 07-Jan-22 at 19:58.

  12. #12
    de Key is vast, zie post 4:

    Key = NQ6cnIH98555I85CaZ7TVx6EZv8y4VYr

    Bovenstaande gaat over de de IV dit zit in de versleutelde string verstopt, gescheiden door ::

  13. #13
    Douwe,

    In Lazarus na de decode base64 is je key niet meer 256 bits lang maar 24 bytes (*8=192bits), dat los je op door de key aan te vullen met met zeros zoals in de post van [rvk], maar de length functie geeft nog steeds 24 byts (en dus 192 bit) terug dus moet je daarom in plaats van de length 256 opgeven.

  14. #14
    Ok, dat heb ik nu gedaan, maar het resultaat is nog steeds niet goed.

  15. #15
    heb je voor ons de nieuwe code?

Page 1 of 3 1 2 3 LastLast

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
  •