2010-08-06 57 views
6

我試圖在PHP中使用Funambol移動同步服務器中使用的密碼加密算法,但是我很難從非Java背景來。代碼本身看起來很簡單:在PHP中實現這個Java密碼加密算法

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

我不一定要尋找一個完整的解決方案,而是指出我可以在PHP的一面使用什麼。 mcrypt可以處理這個問題和程度如何?我還需要什麼?這是甚至可以在PHP中?

好奇:我正在構建一個Funambol服務器的接口,我希望能夠使用PHP從接口本身添加用戶。

+2

這是因爲算法是使用一些框架看起來很簡單。第一步是查看是否有相當於Triple DES的PHP(請參閱http://en.wikipedia.org/wiki/Triple_DES)。如果可能的話,你可以考慮在Java端添加一些可以直接通過PHP調用的外部接口。 – 2010-08-06 07:56:53

+8

請參閱http://php.net/manual/en/function.mcrypt-encrypt.php它允許三重DES。 – Artefacto 2010-08-06 11:11:36

+5

我相信朱利葉斯凱撒的報價應該是'divisa'而不是'divida' - 無論如何它是:'來自http://www.thelatinlibrary.com/caesar/gall1.shtml的Gallia est omnis divisa in partes tres' - - 儘管使用不正確的版本可能會更復雜:p – 2010-08-09 20:26:24

回答

3

終於得到了解決,在這裏發帖萬一有人曾經需要進行加密或者使用PHP解密密碼的Funambol:

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

這可能是你想要什麼:

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

通知我加密$sDataSize用的,因爲數據的方式3DES encypts /解密數據塊。