Programmierung des HMAC

Hallo allerseits,

ich möchte den HMAC in PHP implementieren (also selber..). PHP hat bereits eine Funktion, die den HMAC entsprechend verwendet und erzeugt eine andere Ausgabe als bei meiner Implementation.

Zunächst habe ich die Programmierung mit "einem" (tatsächlich zwei, um Unterschiede zu vergleichen..aber key1 hat mich bereits verunsichert) vorgegebenen Key fixiert. Dies um einen variablen Key zu erweitern ist kein Problem. Mein bisheriger Code ist:

PHP:
// generiere das innerpadding
	$ipad_base = '00110110';
	$ipad = '';
	for($k=1; $k<=8; $k++){
		$ipad .= $ipad_base;
	}
	
	// generiere das outerpadding
	$opad_base = '01011100';
	$opad = '';
	for($k=1; $k<=8; $k++){
		$opad .= $opad_base;
	}
	
	
	$key1 = 'x2b7foe6';
	$key2 = 'x2b7foe5';
	
	//Keys als binäre Strings
	$password1 = convert_ascii2bin($key1);
	$password2 = convert_ascii2bin($key2);
	
	$inner_key1 = convert_bin2ascii(xor_bin($ipad, $password1));
	$outer_key1 = convert_bin2ascii(xor_bin($opad, $password1));
	
	$inner_key2 = convert_bin2ascii(xor_bin($ipad, $password2));
	$outer_key2 = convert_bin2ascii(xor_bin($opad, $password2));
	
	
	$x = $_POST['text'];
	
	$inner_string1 = $inner_key1 . $x;
	$inner_string2 = $inner_key2 . $x;
	
	$inner_hash1 = hash("SHA256", $inner_string1, true);
	$inner_hash2 = hash("SHA256", $inner_string2, true);
	
	//echo $inner_hash1;
	
	$outer_string1 = $outer_key1 . $inner_hash1;
	$outer_string2 = $outer_key2 . $inner_hash2;
	
	$hmac1 = hash("SHA256", $outer_string1, true);
	$hmac2 = hash("SHA256", $outer_string2, true);
	
	echo 'Der HMAC zum Key ' . $key1 . ' lautet: <br>' . $hmac1 . '<br>';
	//echo '<br>';
	//echo 'Der HMAC zum Key ' . $key2 . 'lautet: ' . $hmac2;
	echo hash_hmac('SHA256', $x, $key1, true);
	echo '<br> im Vergleich von PHP berechnet.';

Die Ausgabe kann auf Kryptographie Testbereich angeguckt werden.

Fällt hier jemandem ein Fehler auf, und kann mir vlt. begründen, warum die Ausgaben so unterschiedlich sind? Ich habe mich nämlich an den "Pseudocode" aus dem Buch gehalten.

Viele Grüße und vielen Dank für die Hilfe und Zeit!

PS: Eben aufgefallen, dass ich "convert2ascii" oder so verwende, hier die Funktion:
PHP:
function convert_ascii2bin( $ascii ){
	$output = '';
	for($k=0; $k< strlen($ascii); $k++){
		$dec = ord($ascii[$k]);
		$bin = fill(base_convert($dec,10,2),2);
		$output .= $bin;
	}
	
	return $output;
}
function convert_bin2ascii( $bin ){
	$ausgabe = '';
	for($k=0; $k < strlen($bin)/8; $k++){
		$bin_part = substr($bin, 8*$k, 8);
		$dec = bindec($bin_part);
		$ausgabe .= chr($dec);
	}
	
	return $ausgabe;
}
function convert_hex2ascii( $hex ){
	$ausgabe = '';
	for ($k=0; $k < strlen($hex)/2; $k++ ){
		$hex_part = substr($hex, 2*$k, 2);
		$dec = hexdec($hex_part);
		$ausgabe .= chr($dec);
	}
	
	return $ausgabe;
}
 
Zuletzt bearbeitet:
Zurück
Oben