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à?