Seite 1 von 1

Fehler in function.pack -> Type H: illegal hex digit

Verfasst: 17.09.2008 11:46
von Dungeonwatcher
Moin! 8)

Ich muss mal wieder die netten PHP Genies mit einer Frage "nerven". :roll:

Ich biete in meinem Forum u.a. die Verschlüsselung der PNs an (Private Message Encryption and Decryption). Das funktioniert bis auf zwei Unschönheiten auch bestens. Eine dieser Unschönheiten betrifft diese Fehlermeldung, wenn beim entschlüsseln vergessen wird das PW einzugeben:
PHP Warning: pack(): Type H: illegal hex digit y in ...\privmsg.php on line 690
Das betrifft die Zeile:

Code: Alles auswählen

$decrypted_message = trim(mcrypt_decrypt($cipher_alg, $encryption_key, pack("H*", $decrypted_message), MCRYPT_MODE_CFB, "$iv"));
in diesem Stück Code:

Code: Alles auswählen

if ( $decrypt )
		{
			srand((double) microtime() * 1000000);
			$cipher_alg = MCRYPT_RIJNDAEL_256;
			$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
			$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
			$key = "This is a very secret key";
			$decrypted_message = str_replace("<b>Um diese verschl&uuml;sselte Nachricht zu lesen, gebe das Passwort unten rechts ein und klicke dann auf den Button \"Nachricht entschl&uuml;sseln\":</b>\n\n", "", $private_message);
			$decrypted_message = str_replace("<br />", "", $decrypted_message);
			$decrypted_message = trim(mcrypt_decrypt($cipher_alg, $encryption_key, pack("H*", $decrypted_message), MCRYPT_MODE_CFB, "$iv"));
			$decrypted_message = stripslashes($decrypted_message);
			$private_message = str_replace("\r\n", "<br />", $decrypted_message);
			$decrypted_message = str_replace("\"", """, $decrypted_message);
			$decrypted_message = stripslashes($decrypted_message);
		}
Nun könnte ich diese PHP Warnung zwar durch ein hinzufügen von @ in der betreffenden Zeile ausblenden:

Code: Alles auswählen

$decrypted_message = trim(mcrypt_decrypt($cipher_alg, $encryption_key, @pack("H*", $decrypted_message), MCRYPT_MODE_CFB, "$iv"));
aber das löst das eigentliche Problem ja nicht. Wenn ich das ganze richtig verstehe, gibt es diese Warnung deswegen, weil keine Hex-Zeichenkette zur weiteren Verarbeitung angegeben wurde. Das leuchtet mir ein. Nur wie müsste das ganze aussehen, damit dieser Fehler abgefangen und eine entsprechende Fehlermeldung ausgegeben wird?

Bye

Verfasst: 17.09.2008 13:52
von Dr.Death
Frag doch vorher per IF Anweisung ab, ob das Passwort überhaupt gesetzt worden ist....

Verfasst: 28.09.2008 19:30
von Dungeonwatcher
'n Abend! 8)

Sorry für meine späte Reaktion. Mein Arbeitgeber nimmt mich momentan mächtig ran. :roll:

Folgendermaßen habe ich es umgesetzt:

Code: Alles auswählen

	if ( $decrypt )
	{
		if ( ! empty ($encryption_key))
		{
			srand((double) microtime() * 1000000);
			$cipher_alg = MCRYPT_RIJNDAEL_256;
			$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
			$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
			$key = "This is a very secret key";
			$decrypted_message = str_replace("<b>Um diese verschl&uuml;sselte Nachricht zu lesen, gebe das Passwort unten rechts ein und klicke dann auf den Button \"Nachricht entschl&uuml;sseln\":</b>\n\n", "", $private_message);
			$decrypted_message = str_replace("<br />", "", $decrypted_message);
			$decrypted_message = trim(mcrypt_decrypt($cipher_alg, $encryption_key, pack("H*", $decrypted_message), MCRYPT_MODE_CFB, "$iv"));
			$decrypted_message = stripslashes($decrypted_message);
			$private_message = str_replace("\r\n", "<br />", $decrypted_message);
			$decrypted_message = str_replace("\"", """, $decrypted_message);
			$decrypted_message = stripslashes($decrypted_message);
		}
		else if ( empty ($encryption_key))
		{
			$error = TRUE;
			$error_msg .= ( ( !empty($error_msg) ) ? '<br />' : '' ) . $lang['Empty_decryption_key'];
			$template->set_filenames(array(
				'reg_header' => 'error_body.tpl')
			);
			$template->assign_vars(array(
				'ERROR_MESSAGE' => $error_msg)
			);
			$template->assign_var_from_handle('ERROR_BOX', 'reg_header');
		}
	}
Dazu dann noch in der lang_main.php dies einfügen:

Code: Alles auswählen

$lang['Empty_decryption_key'] = 'Wenn du eine Nachricht entschl&uuml;sseln willst, musst du ein Passwort eingeben.';
und in die privmsg_read_body.tpl dies {ERROR_BOX} an die gewünschte Stelle einfügen. Dann gibt's die gewünschte Fehlermeldung.

Bye