php aes java_AES加密:PHP与Java互通问题

问题:使用Java默认的AES加密方式(Cipher.getInstance("AES"))并对加密后结果进行Base64编码,这样php(http://phpaes.com/使用这里免费的AES实现版本

)里可以成功进行解密。而在Php加密后的字符串无法在Java中成功解密。

1.Java中AES加密与解密默认使用AES/ECB/PKCS5Padding模式;

2.php中的AES算法实现使用AES/ECB/NoPadding

要注意特定的Padding实现跟算法的blockSize有关,这里php的blocksize是16。在php的aes加密前先对源字符串进行Padding,问题得到解决。

前面提到Java默认的AES加密在php 的上述aes实现中可以成功解密。其实该php解密虽然看上去是成功的,其实里面还是有些问题的。因为解密出来的字符串因为Java端加密时会padding操作,php解密以后padding的字符没有被去掉导致会出现问题。因此解密时需要removePaddingStr才能得到原始的字符串。

/**

* 手机号加密

*/

private function phoneEncode($phone)

{

$key = 'abcdefgh1234567890';

$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');

$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);

$padding = $size - (strlen($phone) % $size);

$phone_padding = $phone . str_repeat(chr($padding), $padding);

mcrypt_generic_init($td, $key, $iv);

$cyper_text = mcrypt_generic($td, $phone_padding);

$result = strtoupper(bin2hex($cyper_text));

mcrypt_generic_deinit($td);

mcrypt_module_close($td);

return $result;

}

/**

* 手机号解密

*/

private function phoneDecode($phone)

{

$key = 'abcdefgh1234567890';

$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');

$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

mcrypt_generic_init($td, $key, $iv);

$text = mdecrypt_generic($td, hex2bin($phone));

$pad = ord($text{strlen($text) - 1});

$phone = substr($text, 0, -1 * $pad);

mcrypt_generic_deinit($td);

mcrypt_module_close($td);

return $phone;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值