Base64 codifica le differenze nell'implementazione di BCrypt

3

Stavo leggendo il codice sorgente di diverse implementazioni di BCrypt e ho scoperto che due implementazioni c comuni hanno una differenza nella loro codifica base64 per il sale.

Qual è l'effetto, se esiste, delle differenze sulla riga 18 e sulla riga 22 delle due implementazioni di codifica base64 di seguito.

Implementazione originale

/**
 * 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;
}

Implementazione di 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;
}

Differenze affiancate:

+------+-------------------------+------------------+
| Line | Niels Provos            | OpenWall         |
+------+-------------------------+------------------+
|   18 | $c1 |= $c2 >> 4 & 0x0f; | $c1 |= $c2 >> 4; |
|      |                         |                  |
|   22 | $c1 |= $c2 >> 6 & 0x03; | $c1 |= $c2 >> 6; |
+------+-------------------------+------------------+

Le differenze hanno qualche effetto? influenzano la compatibilità?

    
posta Jacco 15.10.2012 - 11:04
fonte

1 risposta

4

Non c'è differenza qui. L'implementazione di Niels fa un ulteriore passo in avanti per verificare che i bit corretti siano impostati / non impostati, usando & come maschera di bit:

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)

Si noti che 0x0F maschera tutti tranne i quattro bit più a destra, mentre 0x03 maschera tutti tranne i due bit più a destra. Quindi considera che gli spostamenti lasciano rispettivamente 4 e 2 bit, su un valore di 8 bit.

In quanto tale, fintanto che $c2 è un valore di 8 bit, la maschera di bit non è necessaria e le due implementazioni sono uguali.

    
risposta data 15.10.2012 - 11:48
fonte

Leggi altre domande sui tag