首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Rijndael_256(AES)解密PHP密码中的Java数据

用Rijndael_256(AES)解密PHP密码中的Java数据
EN

Stack Overflow用户
提问于 2014-05-08 10:42:06
回答 1查看 4.4K关注 0票数 0

几天来,我一直试图将PHP服务中的加密数据发送给我的android应用程序。我想使用Rijndael 256位加密。

在PHP中加密和解密字符串很好。我所做的就是按照以下结构(初始化向量+哈希(Md5)+加密数据)从php发送数据到android。

在Java中,我将接收到的字符串分成三个部分。

但是,我在java中得到的是一条错误消息,它告诉我们: IV必须有16字节长。我在网上查了一遍,试图找到解决这个问题的办法。有些人建议不要在php中使用mcrypt,而另一些人则说使用128算法变体。在PHP中使用128位会破坏加密。

下面我有两个例子,也许可以进一步澄清这个问题。

谢谢你的帮助。

PHP代码加密/解密:

代码语言:javascript
复制
   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解密:

代码语言:javascript
复制
    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;
            }
}
EN

回答 1

Stack Overflow用户

发布于 2014-05-08 10:54:58

嗯,您的一个问题是,JCE不支持AES 256位(如果不更改JCE策略文件,最多支持128位)。要么对PHP使用128位加密,要么.

正如您在文档中所看到的,“如果需要更强的算法(例如,带有256位密钥的AES ),则必须获取JCE无限强管辖权策略文件,并将其安装在JDK/JRE中。”

用户有责任核实这一行动在当地法规下是允许的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23539444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档