Base64 codifica las diferencias en implementaciones de BCrypt

3

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?

    
pregunta Jacco 15.10.2012 - 11:04
fuente

1 respuesta

4

No hay diferencia aquí. La implementación de Niels solo va un paso más allá para verificar que los bits correctos estén activados / desactivados, usando & como máscara de bits:

10010111 >> 4 = 00001001 (OpenWall's outputs this value)
0x0F = 00001111
00001001 & 00001111 = 00001001 (Niels' implementation outputs this value)

11010111 >> 6 = 00000010 (OpenWall's outputs this value)
0x03 = 00000011
00000010 & 00000011 = 00000010 (Niels' implementation outputs this value)

Note que 0x0F enmascara todos menos los cuatro bits más a la derecha, mientras que 0x03 enmascara todos menos los dos bits más a la derecha Luego considere que los desplazamientos dejan 4 y 2 bits restantes, respectivamente, en un valor de 8 bits.

Como tal, siempre que $c2 sea un valor de 8 bits, la máscara de bits no es necesaria y las dos implementaciones son iguales.

    
respondido por el Polynomial 15.10.2012 - 11:48
fuente

Lea otras preguntas en las etiquetas