Delphi DEC library (Rijndael) encryption

前端 未结 3 678
猫巷女王i
猫巷女王i 2021-02-09 07:01

I am trying to use the DEC 3.0 library (Delphi Encryption Compedium Part I) to encrypt data in Delphi 7 and send it to a PHP script through POST, where I am dec

3条回答
  •  我寻月下人不归
    2021-02-09 07:10

    OK, so to sum this up, there were 3 problems with my code:

    1. Due to my poor understanding of mcrypt and ciphers in general, MCRYPT_RIJNDAEL_256 refers to 128 bits block and doesn't refer to the keysize. My correct choice should have been MCRYPT_RIJNDAEL_128, which is the AES standard and is also supported by DEC 3.0.

    2. DEC has it's own default key derivation, so I needed to bypass it so I wouldn't have to implement it in PHP also. In actuality, I am using my own key derivation algorithm that was easy to reproduce in PHP (first 32 characters of sha1(key)).

    3. DEC doesn't pad plaintext to a multiple of the block size of the cipher, as mcrypt expects, so I had to do it manually.

    Providing working code below:

    Delphi:

    uses Windows, DECUtil, Cipher, Cipher1, CryptoAPI;
    
    function EncryptMsgData(MsgData, Key: string): string;
    var RCipher: TCipher_Rijndael;
        KeyStr: string;
    begin
      Result:= '';
      try
        // key derivation; just making sure to feed the cipher a 24 chars key
        HashStr(HASH_SHA1, Key, KeyStr);
        KeyStr:= Copy(KeyStr, 1, 24);
        RCipher:= TCipher_Rijndael.Create('', nil);
        RCipher.Init(Pointer(KeyStr)^, Length(KeyStr), nil);
        RCipher.Mode:= cmECB;
        Result:= RCipher.CodeString(MsgData + StringOfChar(#0,16-(Length(MsgData) mod 16)), paEncode, fmtMIME64);
        RCipher.Free;
      except
      end;
    end;
    

    PHP:

    function decryptMsgContent($msgContent, $sKey) {
        $sKey = substr(sha1(sKey), 0, 24);
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $sKey, base64_decode($msgContent), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND)));
    }
    

提交回复
热议问题