Spiacenti, ma l'ho scoperto più tardi da RubyForum
"L'algoritmo crea solo un buffer da 16 byte impostato su zero, quindi su cicli
attraverso tutti i caratteri della stringa che fornisci e fa un
assegnazione con XOR bit a bit tra i due valori. Se iteriamo fino a quando
abbiamo raggiunto la fine del buffer da 16 byte, ricominciamo da
cominciando a fare ^ =. Per le stringhe più corte di 16 caratteri, ci fermiamo a
la fine della stringa. "
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;
}
che sembra simile a 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
e l'ho applicato 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
Probabilmente è meglio non usare una password ripetitiva come "MySQL=insecure! MySQL=insecure! "
perché azzererebbe la chiave risultante.