Encrypt und Decrypt mit PHP



  • Es existiert ja Code in Python und Javascript zur Ver- und Entschlüsselung (https://air-q-updates.s3.eu-central-1.amazonaws.com/dokumentation/index.html). Das lässt sich auch auf PHP portieren.
    Hierzu nutzt man in PHP OpenSSL.

    PHP-decrypt:

    function decrypt($msgb64,$password)
    {
        $airqpass = $password;
    	if (strlen($airqpass) < 32) {
    		for ($i = strlen($airqpass); $i < 32; $i++) {
    			$airqpass = $airqpass . '0';
    		}
    	} else {
    		if (strlen($airqpass) > 32) {
    			$airqpass = substr($airqpass,0,32);
    		}
    	}
    
    	$key = utf8_encode ($airqpass);
    //	$cyphertext = base64_decode ($msgb64);
    //	But with verly long messages there could be some problems in base64_decode
    	$decoded = "";
    	for ($i=0; $i < ceil(strlen($msgb64)/256); $i++)
    	   $decoded = $decoded . base64_decode(substr($msgb64,$i*256,256));
    	$cyphertext = $decoded;
    
    	$iv = substr($cyphertext,0,16);
    	$cyphertext = substr($cyphertext,16,strlen($cyphertext));
    
    	$decrypted = openssl_decrypt($cyphertext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
    	
    	return utf8_encode($decrypted);
    }
    

    PHP-encrypt:

    function encrypt($msgb64,$password)
    {
        $airqpass = $password;
    	if (strlen($airqpass) < 32) {
    		for ($i = strlen($airqpass); $i < 32; $i++) {
    			$airqpass = $airqpass . '0';
    		}
    	} else {
    		if (strlen($airqpass) > 32) {
    			$airqpass = substr($airqpass,0,32);
    		}
    	}
    
    	$key = utf8_encode ($airqpass);
    	
    	$iv = substr(openssl_random_pseudo_bytes(32),0,16);
    
    	$encrypted = openssl_encrypt($msgb64, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
    	return base64_encode($iv . $encrypted);
    }
    


  • <klugscheissermodus> 😉 Ja, so ähnlich mache ich es auch. Aber kleiner Tip, mit str_pad(..,32,"0",STR_PAD_RIGHT) kannst Du Dir die eine Schleife sparen und substr braucht den strlen als dritten Parameter nicht für den String nach dem 16ten Zeichen.

    Die openssl_random_pseudo_bytes Länger kann man natürlich auch hart kodiert angeben, aber etwas besser lesbar ist es evtl. mit openssl_cipher_iv_length('AES-256-CBC').

    Wie ich bei Dir sehe hast du das Padding und Unpadding von den Beispielen nicht mit eingebaut..?
    </klugscheiserfragenmodus>


Log in to reply