2010-08-06 6 views
6

Ich versuche, einen Passwort-Verschlüsselungsalgorithmus in Funambol Mobile Sync-Server in PHP verwendet zu implementieren, aber ich habe harte Zeit, als ich von einem Nicht-Java-Hintergrund kommen. Der Code selbst scheint einfach:Implementierung dieses Java Passwort-Verschlüsselungsalgorithmus in 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); 

Ich bin nicht unbedingt für eine Komplettlösung suchen, sondern Zeiger auf das, was ich auf der PHP-Seite verwenden können. Kann mcrypt das und in welchem ​​Umfang handhaben? Was brauche ich noch? Ist das in PHP überhaupt möglich?

Um Neugierige: Ich baue eine Schnittstelle zu dem Funambol-Server und ich möchte in der Lage sein, Benutzer von der Schnittstelle selbst mit PHP hinzuzufügen.

+2

Es sieht einfach aus, da der Algorithmus einige Frameworks verwendet. Ein erster Schritt wäre es, um zu sehen, ob es eine PHP äquivalent Triple DES (siehe http://en.wikipedia.org/wiki/Triple_DES) ist. Wenn möglich, können Sie eine externe Schnittstelle auf der Java-Seite hinzufügen, die direkt über PHP aufgerufen werden kann. –

+8

Siehe http://php.net/manual/en/function.mcrypt-encrypt.php Es ermöglicht Triple-DIE. – Artefacto

+5

Ich glaube, die Julius Caesar Zitat 'divisa' sein sollte und nicht' divida' - jedenfalls ist es: 'Gallia est omnis divisa in partes tres' von http://www.thelatinlibrary.com/caesar/gall1.shtml - - Obwohl es wahrscheinlich schwieriger ist eine falsche Version zu verwenden: p –

Antwort

3

Schließlich habe es gelöst, hier falls jemand Entsendung jemals braucht Passwörter für Funambol zum Verschlüsseln oder Entschlüsseln mit 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

Dies kann sein, was Sie wollen:

$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); 

Hinweis I verschlüsseln $sDataSize mit den Daten wegen der Art, 3DES encypts/Datenblöcke entschlüsselt.