Php 解密时服务器之间的MCrypt不一致

Php 解密时服务器之间的MCrypt不一致,php,encryption,mcrypt,Php,Encryption,Mcrypt,我有下面的2个Mcrypt方法的类。我加密一个字符串,通过API通过JSONP发送它,让消费者使用相同的解密方法和相同的salt,但我无法解密该字符串。服务器上的测试可以成功地在同一服务器上进行加密和解密,但是,当加密字符串在一台服务器上加密,并试图在另一台服务器上使用正确的salt进行解密时,它根本无法对其进行解密。有了这种模式(MCRYPT_mode_ECB),我的理解是静脉注射是不必要的。有人知道为什么会这样吗 <?php class McryptHelper { /**

我有下面的2个Mcrypt方法的类。我加密一个字符串,通过API通过JSONP发送它,让消费者使用相同的解密方法和相同的salt,但我无法解密该字符串。服务器上的测试可以成功地在同一服务器上进行加密和解密,但是,当加密字符串在一台服务器上加密,并试图在另一台服务器上使用正确的salt进行解密时,它根本无法对其进行解密。有了这种模式(MCRYPT_mode_ECB),我的理解是静脉注射是不必要的。有人知道为什么会这样吗

<?php

class McryptHelper
{
    /**
     * Encrypt
     * Encrypts a string using the MCRYPT_RIJNDAEL_256 cipher and the MCRYPT_MODE_ECB.
     *
     * @static
     * @param string $string
     * @param string $salt
     * @return string
     */
    public static function encrypt($string, $salt)
    {
        $saltSize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $salt = substr($salt, 0, $saltSize);
        $cipherText = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $string, MCRYPT_MODE_ECB);
        $encrypted = base64_encode($cipherText);

        return trim($encrypted);
    }

    /**
     * Decrypt
     * Decrypts a string using the MCRYPT_RIJNDAEL_256 cipher and the MCRYPT_MODE_ECB mode.
     *
     * @static
     * @param string $string
     * @param string $salt
     * @return string
     */
    public static function decrypt($string, $salt)
    {
        $saltSize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $salt = substr($salt, 0, $saltSize);
        $cipherText = base64_decode($string);
        $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $salt, $cipherText, MCRYPT_MODE_ECB);

        return trim($decrypted);
    }
}

您能否确保两端都尝试解密相同的
$cipherText
?例如,比较数据的散列。错误信息到底是什么?请注意,decrypt与encrypt并非完全相反,因为
$string
末尾的任何空格和空字符都将被删除(您在其上调用
trim
,可能是因为mcrypt在加密之前会自动对纯文本(
$string
)进行零填充)。一些加密建议:您应该这样做(很少有例外)永远不要使用ECB。它有一些严重的问题,请参见屏幕上的图像。可能使用循环流化床或CBC?此外,加密对于大多数应用来说是不够的;您还应该实现身份验证方法。我通常会建议该作业使用AEAD分组密码模式,但
mcrypt
似乎没有提供任何建议。相反,您可以使用HMAC使用encrypt-then-mac构造。@Perseids感谢帮助我调试。此外,我已切换到带iv的MCRYPT_模式CBC。还请注意,AES必须使用
MCRYPT_RIJNDAEL_128
。您看过
mcrypt\u encrypt
的示例代码了吗?请注意,salt不是键,请确保正确命名变量,否则可能会出现混淆。。。PS不要点击“高级示例”。。。这仍然是我还没有弄到手的旧废话:)