Moin
Existiert dazu ein gängiger Algorithmus?
Naja soschwer ist es auch nicht ;)
Es kommt immer auf die Key schedule des Algorithmus an.
Ich denke mal du programmierst für 32 Bit Plattformen, ich habe es wie folgt gelöst:
Key: abcdefghijklmnop (16 Byte = 128 Bit)
Key in 4 Byte (32 Bit) unterteilen:
Key: abcd efgh ijkl mnop
Dann die Strings in Integer umrechnen:
a<<24+b<<16+c<<8+d
Dabei wird a,b,c,d durch deren ASCII Code ersetzt, also
97<<24+98<<16+99<<8+100.
Jetzt hast du 4 mal 32 Bit Integer. Anstatt einen String kannst du den User natürlich auch 4 mal einen 32 Bit Integer (als hexadezimal) eingeben lasse, dann enfällt das.
Also Schleife in C sieht das wie folgt aus:
for(i=0;i<4;i++)
{
k[i] = (key[i*4]<<24)+(key[i*4+1]<<16)+(key[i*4+2]<<8)+(key[i*4+3]);
}
Dabei ist key[] das String-Array, und k[] ist das 32 Bit Integer.
So der nächste Schritt ist bei AES w[0],w[1],w[2],w[3] die vier 32 Bit Werte zuzuweisen.
Komplett in PHP sieht es so aus:
function key($string) {
$w = array();
$w = str2long($string); //$key in 4 in 32 Bit Werte aufteilen
$w[0] = $key[0]; //Die ersten 4 $w Elemente sind die 4x32 Bit werden
$w[1] = $key[1];
$w[2] = $key[2];
$w[3] = $key[3];
for($i=4;$i<44;$i++)
{
$temp = $w[$i-1];
if($i%4==0) //Vielfaches von 4
{
//$temp in Bytes zerlegen
$t2 = array();
$t2[3] = $temp & 0xFF;
$t2[2] = $temp>>8 & 0xFF;
$t2[1] = $temp>>16 & 0xFF;
$t2[0] = $temp>>24 & 0xFF;
$t2 = array($t2[1],$t2[2],$t2[3],$t2[0]); //RotWord: Rotat the Bytes/Array-Elements left
$t2 = SubWord($t2,0); //Funktion
$t2[0] ^= Rcon($i>>2); //Rcon ist eine Funktion
$temp = $t2[3]+($t2[2]<<8)+($t2[1]<<16)+($t2[0]<<24);
}
$w[$i] = $w[$i-4]^$temp;
$j++;
}
return $w; //$w wird als Key für die einzelnen Runden benutzt.
}
(Dieser Funktion wurde mit offizielle&inoffizielle Testvektor positiv getestet)
MFG Elderan