Cryptography crypto js与php mcrypt AES加密/解密

Cryptography crypto js与php mcrypt AES加密/解密,cryptography,mcrypt,cryptojs,Cryptography,Mcrypt,Cryptojs,我正试图编写一个跨语言的加密/解密工具(JavaScript vs PHP/mcryp),但我有点被卡住了 您可以在这里找到我的js代码,而我的php代码如下所示: class Manager { /** * @param string $content * @param string $passphrase * @return string */ public static function encrypt($plain, $passp

我正试图编写一个跨语言的加密/解密工具(JavaScript vs PHP/mcryp),但我有点被卡住了

您可以在这里找到我的js代码,而我的php代码如下所示:

class Manager
{

    /**
     * @param string $content
     * @param string $passphrase
     * @return string
     */
    public static function encrypt($plain, $passphrase = null) {
        $salt = mcrypt_create_iv(
            128 / 8,
            MCRYPT_DEV_URANDOM
        );
        $cipher = hash_pbkdf2(
            "sha256",
            $passphrase ? $passphrase : $_ENV['SECURITY_KEY'],
            $salt,
            100,
            128 / 8
        );
        $iv = mcrypt_create_iv(
            mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
            MCRYPT_RAND
        );
        $encrypted = mcrypt_encrypt(
            MCRYPT_RIJNDAEL_128,
            $cipher,
            $plain,
            MCRYPT_MODE_CBC,
            $iv
        );
        return base64_encode($salt) . base64_encode($iv) . base64_encode($encrypted);
    }

    /**
     * @param string $encContent
     * @param string $passphrase
     * @return string
     */
    public static function decrypt($encrypted, $passphrase = null) {
        $encrypted = base64_decode($passphrase ? $passphrase : $_ENV['SECURITY_KEY']);
        $salt = substr($encrypted, 0, 128 / 8);
        $cipher = hash_pbkdf2("sha256", $passphrase, $salt, 1000, 128 / 8);
        $iv = substr($encrypted, 128 / 8, 128 / 8);
        return trim(mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128,
            $cipher,
            substr($encrypted, 128 / 8 * 2),
            MCRYPT_MODE_CBC,
            $iv
        ), "\0\t");
    }
}
正如您所注意到的,我在返回salt和cipher变量的相同值时遇到了一些问题

在这两个图书馆有更多经验的人能给我一个提示吗


非常感谢您。

您的JavaScript加密函数hex对salt和IV进行编码,而PHP函数Base64对它们进行编码。不过,这两个函数都使用Base64对密文进行编码


此外,您的PHP解密函数似乎使用了1000轮PBKDF2,而所有其他函数都使用了100轮。

。。。我想:。我认为,我现在唯一的问题是,当php PBKDF2返回16个字符的字符串时,CryptoJS返回32个字符的字符串。我说的只是php加密-CryptoJs解密。一旦我弄明白了这些,我确信我也能获得js encrypt-php DECRIPCH。@DragosCirjan当你在CryptoJS Cipher对象上调用
toString()
时,它会将密文十六进制编码为字符串。相反,您不是在PHP中编码密文。这很让人困惑,因为在PHP中,字符串和字节数组是一样的。我的笔记本电脑在更新php加密函数之前就死了(所以我不得不等待再次获得电源)。正如我所说。。。我的最后一个问题(关注点)是PBKDF2字符串,我仍然不知道如何使其等效(从js到php或php到js)。放弃这个想法。