Estaba leyendo el código fuente de varias implementaciones de BCrypt y descubrí que dos implementaciones comunes de c tienen una diferencia en su codificación de base64 para la sal.
¿Cuál es el efecto, si lo hay, de las diferencias en la línea 18 y la línea 22 de las dos implementaciones de codificación base64 a continuación?
Implementación original
/**
* Original BCrypt implementation
* http://mail-index.netbsd.org/tech-crypto/2002/05/24/msg000204.html
*/
function encodeBase64_a($input) {
$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$i = 0;
$output = '';
while (true) {
$c1 = ord($input{$i++});
$output .= $itoa64{$c1 >> 2};
$c1 = ($c1 & 0x03) << 4;
if ($i >= 16) {
$output .= $itoa64{$c1};
break;
}
$c2 = ord($input{$i++});
$c1 |= $c2 >> 4 & 0x0f;
$output .= $itoa64{$c1};
$c1 = ($c2 & 0x0f) << 2;
$c2 = ord($input{$i++});
$c1 |= $c2 >> 6 & 0x03;
$output .= $itoa64{$c1};
$output .= $itoa64{$c2 & 0x3f};
}
return $output;
}
Implementación de OpenWall
/**
* OpenWall implementation
* crypt_blowfish-1.2
* source: http://www.openwall.com/crypt/
*/
function encodeBase64_b($input) {
$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$i = 0;
$output = '';
while (true) {
$c1 = ord($input{$i++});
$output .= $itoa64{$c1 >> 2};
$c1 = ($c1 & 0x03) << 4;
if ($i >= 16) {
$output .= $itoa64{$c1};
break;
}
$c2 = ord($input{$i++});
$c1 |= $c2 >> 4;
$output .= $itoa64{$c1};
$c1 = ($c2 & 0x0f) << 2;
$c2 = ord($input{$i++});
$c1 |= $c2 >> 6;
$output .= $itoa64{$c1};
$output .= $itoa64{$c2 & 0x3f};
}
return $output;
}
Diferencias lado a lado:
+------+-------------------------+------------------+
| Line | Niels Provos | OpenWall |
+------+-------------------------+------------------+
| 18 | $c1 |= $c2 >> 4 & 0x0f; | $c1 |= $c2 >> 4; |
| | | |
| 22 | $c1 |= $c2 >> 6 & 0x03; | $c1 |= $c2 >> 6; |
+------+-------------------------+------------------+
¿Las diferencias tienen algún efecto? ¿Afectan la compatibilidad?