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

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
Dungeonwatcher
Mitglied
Beiträge: 635
Registriert: 11.07.2004 10:04
Wohnort: Berlin

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

Beitrag 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
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17476
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Beitrag von Dr.Death »

Frag doch vorher per IF Anweisung ab, ob das Passwort überhaupt gesetzt worden ist....
Benutzeravatar
Dungeonwatcher
Mitglied
Beiträge: 635
Registriert: 11.07.2004 10:04
Wohnort: Berlin

Beitrag 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
Antworten

Zurück zu „Coding & Technik“