几天来,我一直试图将PHP服务中的加密数据发送给我的android应用程序。我想使用Rijndael 256位加密。
在PHP中加密和解密字符串很好。我所做的就是按照以下结构(初始化向量+哈希(Md5)+加密数据)从php发送数据到android。
在Java中,我将接收到的字符串分成三个部分。
但是,我在java中得到的是一条错误消息,它告诉我们: IV必须有16字节长。我在网上查了一遍,试图找到解决这个问题的办法。有些人建议不要在php中使用mcrypt,而另一些人则说使用128算法变体。在PHP中使用128位会破坏加密。
下面我有两个例子,也许可以进一步澄清这个问题。
谢谢你的帮助。
PHP代码加密/解密:
function encrypt_data($data,$privk)
{
// Random number for feeding into AES encyption algorithm
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_RAND);
// Check if decrypted properly
$hash = md5($data);
// Encrypt the data using the privk and the iv
$encrypted = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $privk, trim($data), MCRYPT_MODE_CBC, $iv));
$encode = base64_encode($encrypted);
$base64_iv = base64_encode($iv);
return $base64_iv.$hash.'='.$encode;
}
function decrypt_data($data,$privk)
{
// Split data into 3 variables: iv,hash,encdata
$arr = explode('=',$data,3);
$iv = base64_decode($arr[0]);
$hash = $arr[1];
$encdata = base64_decode($arr[2]);
// Decrypt using the 3 variables
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $privk, trim($encdata), MCRYPT_MODE_CBC, $iv));
// Check integrity of decrypted data
$hdec = md5($decrypted);
if ($hdec == $hash)
{
return $decrypted;
}
else
{
return false;
}
}JAVA解密:
public String decryptJson(String data)
{
String[] split= data.trim().split("=");
byte[] iv = Base64.decode(split[0],3);
String hash = split[1];
byte[] encd = Base64.decode(split[2],0);
String skey = "secretkeyfromdatabase";
byte[] skeyb = skey.getBytes();
try
{
IvParameterSpec ivspec = new IvParameterSpec(iv);
SecretKeySpec skeyspec = new SecretKeySpec(skeyb,"AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE,skeyspec,ivspec);
byte[] original = cipher.doFinal(encd);
return original.toString();
}
catch(Exception ex)
{
ex.printStackTrace();
return "ERROR! | "+ex+"IV:"+iv;
}
}发布于 2014-05-08 10:54:58
嗯,您的一个问题是,JCE不支持AES 256位(如果不更改JCE策略文件,最多支持128位)。要么对PHP使用128位加密,要么.
正如您在文档中所看到的,“如果需要更强的算法(例如,带有256位密钥的AES ),则必须获取JCE无限强管辖权策略文件,并将其安装在JDK/JRE中。”
用户有责任核实这一行动在当地法规下是允许的。
https://stackoverflow.com/questions/23539444
复制相似问题