我尝试将数据从我的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
有人知道问题可能是什么吗?
答案 0 :(得分:1)
在阅读填充方法之后,我不再对用于填充输入PKCS5的方法产生问题。但是,用于从输出中去除填充的方法仍然有可能引入您遇到的错误。
这是因为以z
[ord('z') == 122
]结尾的16字节字符串将导致当前方法执行返回substr($data, 0, -122);
的{{1}}。
为了确保最后的字节是填充,您需要读取最后一个字节,验证输出中的最后false
个字节是该字节的重复,并且只在这种情况下修剪字符串。
$padSize
此外,ECB模式几乎是您可能选择的最弱模式。请参阅this wikipedia article中ECB部分末尾的图像,以获得一个很好的例子。
使用CBC。