6

Funambol モバイル同期サーバーで使用されるパスワード暗号化アルゴリズムを 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 を使用して、インターフェース自体からユーザーを追加できるようにしたいと考えています。

4

2 に答える 2

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);
    }
}
于 2010-09-20T10:44:07.670 に答える
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);

$sDataSize3DES がデータのブロックを暗号化/復号化する方法のために、データで暗号化することに注意してください。

于 2010-08-27T06:52:14.913 に答える