Thursday, November 16, 2017

PHP Lazarus kodiranje-dekodiranje

http://forum.lazarus.freepascal.org/index.php?topic=36618.0

As for proof ...

Pascal version:
Code: Pascal  [Select]
  1. program plip;
  2. {$MODE OBJFPC}{$H+}
  3. uses
  4.   SysUtils
  5.   DCPcrypt2, DCPrijndael, DCPbase64;
  6. function BinStr2Hex(S: AnsiString): AnsiString;
  7. var
  8.   i: integer;
  9. begin
  10.   Result := '';
  11.   for i := 1 to Length(S)
  12.     do Result := Result + LowerCase(HexStr(Byte(S[i]), 2));
  13. end;
  14. var
  15.   Cipher : TDCP_rijndael;
  16.   Key    : AnsiString;
  17.   IV     : AnsiString;
  18.   Data   : AnsiString;
  19.   CBC    : AnsiString;
  20.   ECB    : AnsiString;
  21.   Buffer : AnsiString;
  22. begin
  23.   Data := 'Hello World_____';
  24.   Key  := '1234567890______';
  25.   IV   := '______1234567890';
  26.   Cipher := TDCP_rijndael.Create(nil);
  27.   Cipher.Init(Key[1], 128, @IV[1]);
  28.   SetLength(Buffer, Length(Data));
  29.   Cipher.EncryptECB(Data[1], Buffer[1]);
  30.   Cipher.Free;
  31.   ECB := Buffer;  
  32.   Cipher := TDCP_rijndael.Create(nil);
  33.   Cipher.Init(Key[1], 128, @IV[1]);
  34.   SetLength(Buffer, Length(Data));
  35.   Cipher.EncryptCBC(Data[1], Buffer[1], Length(Data));
  36.   Cipher.Free;
  37.   CBC := Buffer;
  38.   WriteLn('KEY        : ', Key             , ' (', Length(Key) , ')');
  39.   WriteLn('IV         : ', IV              , ' (', Length(IV)  , ')');
  40.   WriteLn('DATA       : ', Data            , ' (', Length(Data), ')');
  41.   WriteLn;  
  42.   WriteLn('ECB        : ', BinStr2Hex(ECB) , ' (', Length(ECB) , ')');
  43.   WriteLn('CBC        : ', BinStr2Hex(CBC) , ' (', Length(CBC) , ')');
  44.   WriteLn;  
  45.   ECB := Base64EncodeStr(ECB);
  46.   WriteLn('ECB_BASE64 : ', ECB             , ' (', Length(ECB) , ')');
  47.   CBC := Base64EncodeStr(CBC);
  48.   WriteLn('CBC_BASE64 : ', CBC             , ' (', Length(CBC) , ')');
  49. end.


php version:
Code: PHP  [Select]
  1. <?php
  2.   $DATA = "Hello World_____";
  3.   $KEY  = "1234567890______";
  4.   $IV   = "______1234567890";
  5.   $ECB = mcrypt_ecb(MCRYPT_RIJNDAEL_128,$KEY,$DATA,MCRYPT_ENCRYPT,$IV);
  6.   $CBC = mcrypt_cbc(MCRYPT_RIJNDAEL_128,$KEY,$DATA,MCRYPT_ENCRYPT,$IV);
  7.   echo "KEY        : ".$KEY." (".strlen($KEY).")"."\n";
  8.   echo "IV         : ".$IV." (".strlen($IV).")"."\n";
  9.   echo "DATA       : ".$DATA." (".strlen($DATA).")"."\n";
  10.   echo "\n";
  11.   echo "ECB        : ".bin2hex($ECB)." (".strlen($ECB).")"."\n";
  12.   echo "CBC        : ".bin2hex($CBC)." (".strlen($CBC).")"."\n";
  13.   echo "\n";
  14.   $ECB = base64_encode($ECB);
  15.   echo "ECB_BASE64 : ".$ECB." (".strlen($ECB).")"."\n";
  16.   $CBC = base64_encode($CBC);
  17.   echo "CBC_BASE64 : ".$CBC." (".strlen($CBC).")"."\n";
  18. ?>


Pascal output
Code: [Select]
KEY        : 1234567890______ (16)
IV         : ______1234567890 (16)
DATA       : Hello World_____ (16)

ECB        : aeb97e57a968e70c22bdfc335591b9c6 (16)
CBC        : 8d0d7e91e4d0cdad7a77727c96a124f5 (16)

ECB_BASE64 : rrl+V6lo5wwivfwzVZG5xg== (24)
CBC_BASE64 : jQ1+keTQza16d3J8lqEk9Q== (24)

php output
Code: [Select]
KEY        : 1234567890______ (16)
IV         : ______1234567890 (16)
DATA       : Hello World_____ (16)

ECB        : aeb97e57a968e70c22bdfc335591b9c6 (16)
CBC        : 8d0d7e91e4d0cdad7a77727c96a124f5 (16)

ECB_BASE64 : rrl+V6lo5wwivfwzVZG5xg== (24)
CBC_BASE64 : jQ1+keTQza16d3J8lqEk9Q== (24)

So, once you have a solid base then you can start thinking about messing around with data that doesn't match up the requirements, therefor needs (zero-)padding, and requires fixing up the mess that base64_encode/decode functions made out of things.

And we haven't even started actually sending/receiving data over the interwebs or hashing a key... oh, you want to use ssl as well you said ? :D

Therefor it would be recommended to build on top of what you know is working and take small steps from there to see where things might go amiss. It might perhaps sound tedious to do but that is the only way you are able to figure out where exactly things go wrong (if they go wrong) and be able to 'fix' in  case it requires fixing.

edit: php code and output matching
« Last Edit: April 28, 2017, 03:32:16 pm by molly »