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