Tengo que amar el código abierto! El siguiente código proviene de la versión estable Putty-0.63 release .
sshpubk.c
/*
* Decrypt the private blob.
*/
if (cipher) {
unsigned char key[40];
SHA_State s;
if (!passphrase)
goto error;
if (private_blob_len % cipherblk)
goto error;
SHA_Init(&s);
SHA_Bytes(&s, " SHA_State s;
unsigned char mackey[20];
char header[] = "putty-private-key-file-mac-key";
SHA_Init(&s);
SHA_Bytes(&s, header, sizeof(header)-1);
if (cipher && passphrase)
SHA_Bytes(&s, passphrase, passlen);
SHA_Final(&s, mackey);
hmac_sha1_simple(mackey, 20, macdata, maclen, binary);
smemclr(mackey, sizeof(mackey));
smemclr(&s, sizeof(s));
else {
SHA_Simple(macdata, maclen, binary);
}
/*
* Decrypt the private blob.
*/
if (cipher) {
unsigned char key[40];
SHA_State s;
if (!passphrase)
goto error;
if (private_blob_len % cipherblk)
goto error;
SHA_Init(&s);
SHA_Bytes(&s, " SHA_State s;
unsigned char mackey[20];
char header[] = "putty-private-key-file-mac-key";
SHA_Init(&s);
SHA_Bytes(&s, header, sizeof(header)-1);
if (cipher && passphrase)
SHA_Bytes(&s, passphrase, passlen);
SHA_Final(&s, mackey);
hmac_sha1_simple(mackey, 20, macdata, maclen, binary);
smemclr(mackey, sizeof(mackey));
smemclr(&s, sizeof(s));
else {
SHA_Simple(macdata, maclen, binary);
}
%pre%%pre%", 4);
SHA_Bytes(&s, passphrase, passlen);
SHA_Final(&s, key + 0);
SHA_Init(&s);
SHA_Bytes(&s, "%pre%%pre%%pre%", 4);
SHA_Bytes(&s, passphrase, passlen);
SHA_Final(&s, key + 20);
aes256_decrypt_pubkey(key, private_blob, private_blob_len);
}
%pre%", 4);
SHA_Bytes(&s, passphrase, passlen);
SHA_Final(&s, key + 0);
SHA_Init(&s);
SHA_Bytes(&s, "%pre%%pre%%pre%", 4);
SHA_Bytes(&s, passphrase, passlen);
SHA_Final(&s, key + 20);
aes256_decrypt_pubkey(key, private_blob, private_blob_len);
}
Su contraseña se procesa dos veces con SHA1 con ""else
%code%%code%"
%code%%code%%code%"
y %code% como sales separadas. Los hashes resultantes se concatenan para formar la clave AES de 256 bits. No estoy completamente al tanto de todos los ataques de contraseña actuales, y aunque no creo que este sea el mejor esquema de hashing de contraseñas, no es el peor. Sí, SHA1 fue recientemente considerado no seguro , pero no creo que este esquema sea trivial de romper.
Algo para recordar acerca de la adivinación de contraseñas es que el atacante tiene que saber cuándo hay un éxito. En este caso, los bytes de la clave privada se cifran con una clave generada a partir de una contraseña. Por lo tanto, para cada intento de contraseña, el atacante debe realizar un descifrado AES de 256 bits además del hash. Hay una verificación de integridad para todo el archivo de claves. Para el archivo de claves PuTTY tenemos el siguiente HMAC:
%pre%
Ahora, después de realizar 2 hashes y 1 AES descifrar, el atacante ahora tiene que realizar otro hash SHA1 y un HMAC SHA1 con clave. Sólo para verificar si una suposición era correcta. Si no era un archivo de claves PuTTY, se produce el siguiente %code% :
%pre%
Obviamente no es tan seguro como usar un archivo de claves PuTTY, pero aún así totalizaría 3 hashings, 1 AES descifrar ... y una perdiz en un peral.