在PHP中实现Java密码加密算法
我试图在PHP中实现Funambol移动同步服务器中使用的密码加密算法,但由于我来自非Java背景,所以很难实现。代码本身似乎很简单:在PHP中实现Java密码加密算法,java,php,funambol,Java,Php,Funambol,我试图在PHP中实现Funambol移动同步服务器中使用的密码加密算法,但由于我来自非Java背景,所以很难实现。代码本身似乎很简单: encryptionKey = "Omnia Gallia in tres partes divida est"; byte[] newValue = new byte[24]; System.arraycopy(encryptionKey, 0, newValue, 0, 24); encryptionKey = newValue; KeySpec
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从接口本身添加用户。这可能就是您想要的:
$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);
请注意,由于3DES加密/解密数据块的方式,我使用数据加密
$sDataSize
。最终解决了这个问题,在这里发布,以防有人需要使用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);
}
}
它看起来很简单,因为算法使用了一些框架。第一步是看看是否有一个PHP等价于三重DES(请参阅)。如果可能的话,您可以考虑在java端添加一些外部接口,可以直接通过PHP调用。请参阅它允许三重DES。我相信Julius Caesar引用应该是代码> diVase<代码>,而不是<代码> DeBaA<代码>——无论如何:<代码> GalIIA.OMNIS DIVACE在PARES TESS <代码>中——尽管使用它可能更棘手。版本不正确:这并不重要,但使用System.arraycopy获取字符串的字节表示形式很可能会在您获取unicode中高于代码点255的字符时中断。您可能希望改为使用String.getBytes()进行转换。