javaphpfunambol

Implementing this Java password encryption algorithm in PHP


I'm trying to implement a password encryption algorithm used in Funambol mobile sync server in PHP but I'm having hard time as I come from a non-Java background. The code itself seems simple:

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

I'm not necessarily looking for a complete solution, rather pointers on what I can use on PHP's side. Can mcrypt handle this and to what extent? What else do I need? Is this even doable in PHP?

To the curious: I'm building an interface to the Funambol server and I'd like to be able to add users from the interface itself using PHP.


Solution

  • Finally got it solved, posting here in case someone ever needs to encrypt or decrypt passwords for Funambol using 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);
        }
    }