AES加密:PHP与Java互通问题
问题:使⽤Java默认的AES加密⽅式(Instance("AES"))并对加密后结果进⾏Base64编码,这样php(
)⾥可以成功进⾏解密。⽽在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);
java源代码加密return $phone;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论