2010-08-06 10 views
6

Estoy tratando de implementar un algoritmo de cifrado de contraseñas utilizado en el servidor de sincronización móvil Funambol en PHP, pero estoy teniendo dificultades ya que provengo de un fondo que no es Java. El código en sí mismo parece simple:Implementación de este algoritmo de cifrado de contraseñas Java en PHP

encryptionKey = "Omnia Gallia in tres partes divida est"; 
byte[] newValue = new byte[24]; 
System.arraycopy(encryptionKey, 0, newValue, 0, 24); 
encryptionKey = newValue; 

KeySpec keySpec    = new DESedeKeySpec(encryptionKey); 
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESEde"); 
Cipher cipher    = Cipher.getInstance("DESEde");  
SecretKey key    = keyFactory.generateSecret(keySpec); 

cipher.init(Cipher.ENCRYPT_MODE, key); 

cipherBytes = cipher.doFinal(plainBytes); 

No estoy necesariamente en busca de una solución completa, más punteros en lo que puedo utilizar en el lado de PHP. ¿Puede mcrypt manejar esto y en qué medida? ¿Qué más necesito? ¿Esto es factible en PHP?

Para lo curioso: estoy construyendo una interfaz para el servidor Funambol y me gustaría poder agregar usuarios de la interfaz mediante PHP.

+2

Parece simple porque el algoritmo está utilizando algunos marcos. Un primer paso sería ver si hay un PHP equivalente a Triple DES (ver http://en.wikipedia.org/wiki/Triple_DES). Si es posible, podría considerar agregar alguna interfaz externa en el lado de Java que se pueda llamar directamente a través de PHP. –

+8

Ver http://php.net/manual/en/function.mcrypt-encrypt.php Permite DES triple. – Artefacto

+5

Creo que la cita de Julio César debe ser 'divisa' y no' divida'; en cualquier caso, es: 'Gallia est omnis divisa en partes tres' de http://www.thelatinlibrary.com/caesar/gall1.shtml - - Aunque probablemente sea más complicado usar una versión incorrecta: p –

Respuesta

3

Finalmente lo tiene resuelto, publicar aquí en caso de que alguien alguna vez necesita para cifrar o descifrar las contraseñas de Funambol usando PHP:

class Funambol_auth { 

    private static $key = "Omnia Gallia in tres par"; 

    public static function encrypt($data) { 
     $size = mcrypt_get_block_size('des', 'ecb'); 
     $data = self::pkcs5_pad($data, $size); 
     $mcrypt_module = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'ecb', ''); 
     $mcrypt_iv  = mcrypt_create_iv(mcrypt_enc_get_iv_size($mcrypt_module), MCRYPT_RAND); 
     $key_size  = mcrypt_enc_get_key_size($mcrypt_module); 

     mcrypt_generic_init($mcrypt_module,self::$key,$mcrypt_iv); 
     $encrypted = base64_encode(mcrypt_generic($mcrypt_module, $data)); 
     mcrypt_module_close($mcrypt_module); 

     return $encrypted; 
    } 

    public static function decrypt($data) { 
     $mcrypt_module = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'ecb', ''); 
     $mcrypt_iv  = mcrypt_create_iv(mcrypt_enc_get_iv_size($mcrypt_module), MCRYPT_RAND); 
     $decrypted  = mcrypt_decrypt(MCRYPT_TRIPLEDES, self::$key, base64_decode($data), 'ecb', $mcrypt_iv); 
     mcrypt_module_close($mcrypt_module); 

     return self::pkcs5_unpad($decrypted); 
    } 

    private static function pkcs5_pad($text, $blocksize) { 
     $pad = $blocksize - (strlen($text) % $blocksize); 
     return $text . str_repeat(chr($pad), $pad); 
    } 

    private static function pkcs5_unpad($text) { 
     $pad = ord($text{strlen($text)-1}); 
     if ($pad > strlen($text)) return false; 
     if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; 
     return substr($text, 0, -1 * $pad); 
    } 
} 
1

Esto puede ser lo que quiere:

$td = mcrypt_module_open('tripledes', '', 'ecb', ''); 
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
$nKeySize = mcrypt_enc_get_key_size($td); 

$key = substr(sha1($encryptionKey), 0, $nKeySize); 
mcrypt_generic_init($td, $key, $iv); 
$nDataSize = strlen($plainBytes); 
$sDataSize = substr(dechex(ceil(log($nDataSize,16))), -1) . dechex($nDataSize); 

$cipherBytes = mcrypt_generic($td, $sDataSize . $plainBytes); 

mcrypt_generic_deinit($td); 
mcrypt_module_close($td); 

Aviso I cifrar $sDataSize con los datos debido a la forma 3DES encypts/descifra bloques de datos.