puddingpp 2019-06-27
PHP mcrypt_encrypt使用给定的 cipher 和 mode 加密的数据,没有使用pkcs5_pad()函数填充的情况下,如果数据长度不是n*分组大小,则在其后使用“0”补齐。
Java 不能使用AES/ECB/PKCS5Padding,因为填充方式与php不同,不能正常的解密
在java中应该使用AES/ECB/NoPadding方式,手动使用"0",填充补齐
一、PHP加密解密类示例:
<?php /** * AES * AES加密解密算法 * Created by PhpStorm. * Date: 2015/4/28 * Time: 15:41 */ namespace Fin\App\Library\Util; class AES { /** * 算法,另外还有192和256两种长度 */ const CIPHER = MCRYPT_RIJNDAEL_128; /** * 模式 */ const MODE = MCRYPT_MODE_ECB; /** * 加密 * @param string $key 密钥 * @param string $str 需加密的字符串 * * @return string */ static public function encode($key, $str) { if(empty($key)){ $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; } $size = mcrypt_get_iv_size(self::CIPHER, self::MODE); $iv = mcrypt_create_iv($size, MCRYPT_RAND); $string = mcrypt_encrypt(self::CIPHER, $key, $str, self::MODE, $iv); $string = base64_encode($string); return $string; } /** * 解密 * @param type $key * @param type $str * * @return string */ static public function decode($key, $str) { if(empty($key)){ $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; } $size = mcrypt_get_iv_size(self::CIPHER, self::MODE); $iv = mcrypt_create_iv($size, MCRYPT_RAND); $string = base64_decode($str); $string = mcrypt_decrypt(self::CIPHER, $key, $string, self::MODE, $iv); /** * 解决下边问题 * the given cipher and mode. If the size of the data is not n * blocksize, * the data will be padded with '\0'. */ $string = trim($string); return $string; } }
二、 JAVA加密解密类示例:
import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.*; public class Security { public static String encrypt(String input, String key) { byte[] crypted = null; try { input = StringUtils.rightPad(input, 16, "\0"); SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, skey); crypted = cipher.doFinal(input.getBytes()); } catch (Exception e) { System.out.println(e.toString()); } return new String(Base64.encodeBase64(crypted)); } public static String decrypt(String input, String key) { byte[] output = null; try { SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, skey); output = cipher.doFinal(Base64.decodeBase64(input)); } catch (Exception e) { System.out.println(e.toString()); } return new String(output); } public static void main(String[] args) { String key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; String data = "412016278912497"; System.out.println(Security.encrypt(data, key)); System.out.println(Security.decrypt(Security.encrypt(data, key), key)); } }