Replicar el hashing de contraseñas PHPBB en ASP.net c #

Estoy usando phpbb 3.0.8 en este momento. Tiene 3,000 usuarios y alrededor de 60,000 publicaciones. Estoy cambiando el foro a otro diferente, escrito en ASP clásico (sé que la gente lo desaprobará pero tengo buenas razones).

Mi sitio está escrito en ASP.net. El foro ASP clásico tiene una API para conectarse. He configurado todo esto, y funciona bien. He escrito mi propio formulario de inicio de sesión.

Quiero copiar todas las cuentas de usuario. El foro actual tiene la tabla:

Username | Password |  Hash  |  Salt

He anulado la técnica clásica de hash ASP para usar ASP.netSecurity.SHA1 hash. La contraseña se almacena comoSHA1(rawpassword + salt).

Mi plan es almacenar nuevos campos junto a los actuales:

UserID | Password |  Hash  |  Salt  |  PHPBBHash

Cuando el usuario inicia sesión, si el campo de hashh de PHPBB está configurado, cambia la contraseña con el hash de PHPBB. Luego, si el inicio de sesión es exitoso, elimina el campo PHPBBHash y crea los valores hash de los sistemas actuales. De esta manera, es una transición sin problemas de PHPBB al nuevo foro, y nadie pierde sus cuentas.

Mi problema es, dado un hash PHPBB, un nombre de usuario y una contraseña, en ASP.net c # ¿cómo puedo verificar el hash PHPBB? ¿Cómo lo calcula?

Mi preocupación también es que la función de hash ASP clásica afirmaba ser SHA1, pero produjo resultados diferentes aSecuriy.SHA1.

Edita

He ofrecido una recompensa por esto si alguien me puede dar una solución definitiva, agradezco la respuesta que vincula a los recursos, pero todavía estoy luchando por entenderlo.

Caso de prueb

Contraseña sin procesar:

blingblangblaow222

En la base de datos PHPBB3:

username: Tom
username_clean: tom
user_password: $H$9ojo08A3LuhnkXR27p.WK7dJmOdazh0
user_passchg: 1301433947
user_form_salt: 637f480dfdab84ef

Usando el código de ejemplo de la respuesta de Vishalgiris, hacemos esto:

phpBB.phpBBCryptoServiceProvider cPhpBB = new phpBB.phpBBCryptoServiceProvider();
string remoteHash = "$H$9ojo08A3LuhnkXR27p.WK7dJmOdazh0";
bool result = cPhpBB.phpbbCheckHash("blingblangblaow222", remoteHash);
Response.Write("<BR><BR><BR>" + result);

Esto en realidad devuelve verdadero. ¡Súper! ¿Pero alguien sabe por qué esto funciona? Estoy desconcertado, no parece tener en cuenta la sal en absoluto.

Respuestas a la pregunta(3)

Su respuesta a la pregunta