【发布时间】:2014-06-25 16:59:32
【问题描述】:
几天来,我一直在尝试将加密数据从 PHP 服务获取到我的 android 应用程序。我想使用 Rijndael 256 位加密。
在 PHP 中加密和解密字符串可以正常工作。 我所做的是我将数据从 php 发送到 android 如下结构 = (初始化向量 + hash(md5) + 加密数据)。
在 Java 中,我将接收到的字符串分成 3 个隔间。
但我在 java 中得到的是一条错误消息:IV 必须是 16 字节长。 我检查了整个互联网,试图找到解决这个问题的方法。 一些人建议不要在 php 中使用 mcrypt,而另一些人则建议使用 128 算法变体。在 PHP 中使用 128 位会破坏加密。
下面我有 2 个例子可以进一步阐明问题。
感谢您的帮助。
PHP CODE加密/解密:
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;
}
}
【问题讨论】:
-
在看到“IV 必须为 16 字节长”的错误消息后,您应该检查一下
byte[] iv的长度以及为什么它不是 16 字节。 -
@OlegEstekhin 我看到它的长度是 32 个字节。有没有办法让它接受 32 字节的 IV?
标签: java php encryption aes mcrypt