PHP解密功能失败

时间:2015-12-11 17:19:38

标签: php encryption aes mcrypt

我尝试将数据从我的Android应用程序发送到运行PHP 5.5的Apache2服务器,同时在双方都进行AES-128加密/解密。

奇怪的是,当我在Eclipse上运行java代码来加密数据(作为测试)并使用加密结果在Netbeans上使用PHP解密它时,它运行得很好。将代码传输到Android也会提供相同的加密结果,但服务器上的解密功能不会返回任何结果,它只是给出一个空值,我使用的是与Netbeans上使用的完全相同的代码。工作

这是代码    

   if(isset($_POST['param']))
  {
    $param = $_POST['param'];

    $param=decrypt($param, "57238004e784498bbc2f8bf984565090");
}
else
    echo "No post Request Received";


function decrypt($encrypted, $key) {
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, hex2bin($key),hex2bin($encrypted), MCRYPT_MODE_ECB);
        echo $decrypted;
    $padSize = ord(substr($decrypted, -1));
    return substr($decrypted, 0, $padSize*-1);
 }

echo $ decrypted给出了null和返回。

实施例: 密码:269B3F5A2208C533AACB51243CFB9CFB 解密到:28

有人知道问题可能是什么吗?

1 个答案:

答案 0 :(得分:1)

在阅读填充方法之后,我不再对用于填充输入PKCS5的方法产生问题。但是,用于从输出中去除填充的方法仍然有可能引入您遇到的错误。

这是因为以z [ord('z') == 122]结尾的16字节字符串将导致当前方法执行返回substr($data, 0, -122);的{​​{1}}。

为了确保最后的字节是填充,您需要读取最后一个字节,验证输出中的最后false个字节是该字节的重复,并且只在这种情况下修剪字符串。

$padSize

此外,ECB模式几乎是您可能选择的最弱模式。请参阅this wikipedia article中ECB部分末尾的图像,以获得一个很好的例子。

使用CBC。