Lo siento, pero lo encontré más tarde en RubyForum
"El algoritmo simplemente crea un conjunto de búfer de 16 bytes a cero, y luego realiza un bucle
a través de todos los caracteres de la cadena que proporciona y hace una
Asignación con XOR a nivel de bits entre los dos valores. Si iteramos hasta
llegamos al final del búfer de 16 bytes, simplemente comenzamos de nuevo desde el
empezando a hacer ^ =. Para cadenas de menos de 16 caracteres, paramos en
el final de la cadena ".
bzero((char*) rkey,AES_KEY_LENGTH/8); /* Set initial key */
for (ptr= rkey, sptr= key; sptr < key_end; ptr++,sptr++)
{
if (ptr == rkey_end)
ptr= rkey; /* Just loop over tmp_key until we used all key */
*ptr^= (uint8) *sptr;
}
que se ve así en Ruby
def mysql_key2(key)
final_key = "finalKey = b' bzero((char*) rkey,AES_KEY_LENGTH/8); /* Set initial key */
for (ptr= rkey, sptr= key; sptr < key_end; ptr++,sptr++)
{
if (ptr == rkey_end)
ptr= rkey; /* Just loop over tmp_key until we used all key */
*ptr^= (uint8) *sptr;
}
'*16
key = b'mySecretKey'
for i, c in enumerate(key) :
finalKey[i%16] ^= key[i]
" * 16
key.length.times do |i|
final_key[i%16] ^= key[i]
end
final_key
end
y apliqué eso a python:
def mysql_key2(key)
final_key = "finalKey = b'%pre%'*16
key = b'mySecretKey'
for i, c in enumerate(key) :
finalKey[i%16] ^= key[i]
" * 16
key.length.times do |i|
final_key[i%16] ^= key[i]
end
final_key
end
Probablemente sea aconsejable no usar una contraseña repetitiva como "MySQL=insecure! MySQL=insecure! "
, ya que pondría a cero la clave resultante.