Java和PHP完美对接AES加解密
对于应用程序进行加密保护,AES算法被广泛使用。但是在使用Java和PHP进行AES加解密时,很多人都会遇到一些困难。本文就来介绍一下如何实现Java和PHP的完美对接AES加解密。
在进行AES加解密时,我们需要注意以下几个方面:
确定加密算法模式、密钥长度、补码方式、解密串编码方式等参数
密钥处理,是否需要进行算法处理
在Java中,加密算法模式和补码方式需要写完整参数格式
首先,我们需要了解AES加解密的基础知识。无论用哪种语言实现AES加解密,首要考虑的是加密算法模式、密钥长度、补码方式和解密串编码方式等几个参数。确认好这些参数之后,基本上不会出现什么意外情况。
但是不出意外的还是出现意外了,Java使用Cipher cipher = Cipher.getInstance(AES);初始化对象的时候,算法模式和补码方式是什么?不一定所有人都知道,不熟悉java的人只能翻文档或者各种尝试,我现在就直接给出答案 AES = AES/ECB/PKCS5Padding。其他的都需要写完整参数格式例如:AES/CBC/PKCS5Padding等等,写完整参数的,我们可以直接看出来。
算法模式和补码方式确定好之后,用php只要确定好算法模式、补码方式即可。
另外需要注意的就是密钥是否做了算法处理,比如我之前碰到的java的代码里key做了SHA1PRNG算法处理,那么再php里同样做一次SHA1PRNG算法处理即可,下面贴出php代码和java代码
【php代码】
1 //密钥,根据实际情况来决定是否需要做base64_decode 2 $keySource = base64_decode("a2V5LXpoZXNoaWtleS1qaXVzaGlrZXk="); 3 4 //key做SHA1PRNG算法处理,根据实际情况决定是否处理 5 $key= substr(openssl_digest(openssl_digest($keySource, 'sha1', true), 'sha1', true), 0, 16); 6 7 $content = "ABC123"; 8 $cipher_algo="aes-128-ecb"; 9 10 //加密 11 function aes_encrypt($content, $key) { 12 $encryptContent = openssl_encrypt( 13 $content,//要加/解密的内容 14 $cipher_algo,//加密模式: 可以通过openssl_get_cipher_methods()获取有效密码方式列表 15 $key,//加密密钥[密码] 16 OPENSSL_RAW_DATA,//数据格式选项(可选)【选项有:】:0,OPENSSL_RAW_DATA=1,OPENSSL_ZERO_PADDING=2,OPENSSL_NO_PADDING=3;它有着很重要的作用:0:默认模式,自动进行 pkcs7 补位,同时自动进行 base64 编,1:OPENSSL_RAW_DATA,自动进行 pkcs7 补位, 但是不自动进行 base64 编码2:OPENSSL_ZERO_PADDING,需要自己进行 pkcs7 补位,同时自动进行 base64 编码 17 ''); 18 $encryptContent = base64_encode($encryptContent); 19 return $encryptContent; 20 } 21 //解密 22 function aes_decrypt($content, $key) { 23 $decryptContent = openssl_decrypt( 24 base64_decode($content),//要加/解密的内容 25 $cipher_algo,//加密模式: 可以通过openssl_get_cipher_methods()获取有效密码方式列表 26 $key,//加密密钥[密码] 27 OPENSSL_RAW_DATA,//数据格式选项(可选)【选项有:】:0,OPENSSL_RAW_DATA=1,OPENSSL_ZERO_PADDING=2,OPENSSL_NO_PADDING=3;它有着很重要的作用:0:默认模式,自动进行 pkcs7 补位,同时自动进行 base64 编,1:OPENSSL_RAW_DATA,自动进行 pkcs7 补位, 但是不自动进行 base64 编码2:OPENSSL_ZERO_PADDING,需要自己进行 pkcs7 补位,同时自动进行 base64 编码 28 ''); 29 return $decryptContent; 30 }
【java代码】
1 private static final String ENCRYPT_KEY = "a2V5LXpoZXNoaWtleS1qaXVzaGlrZXk="; 2 3 public static String encrypt(String value) { 4 return null==value ? null : aesEncrypt(value, ENCRYPT_KEY); 5 } 6 7 public static String decrypt(String value) { 8 return null==value ? null : aesDecrypt(value, ENCRYPT_KEY); 9 } 10 11 private static String aesEncrypt(String value, String encryptKey) { 12 try { 13 String key = encryptKey(encryptKey); 14 if (null == key) { 15 return null; 16 } else { 17 KeyGenerator kgen = KeyGenerator.getInstance("AES"); 18 SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); 19 secureRandom.setSeed(key.getBytes()); 20 kgen.init(128, secureRandom); 21 Cipher cipher = Cipher.getInstance("AES");//默认 AES = AES/ECB/PKCS5Padding 22 cipher.init(1, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES")); 23 byte[] bytes = value.getBytes(StandardCharsets.UTF_8); 24 byte[] resultBytes = cipher.doFinal(bytes); 25 return base64Encode(resultBytes); 26 } 27 } catch (Exception e) { 28 log.error("encrypt error", AESUtils.class, new Object[]{e}); 29 return null; 30 } 31 } 32 33 private static String aesDecrypt(String value, String encryptKey) { 34 try { 35 String key = encryptKey(encryptKey); 36 if (null == key) { 37 return null; 38 } else { 39 byte[] bytes = base64Decode(value); 40 KeyGenerator kgen = KeyGenerator.getInstance("AES"); 41 SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); 42 secureRandom.setSeed(key.getBytes()); 43 kgen.init(128, secureRandom); 44 Cipher cipher = Cipher.getInstance("AES");//默认 AES = AES/ECB/PKCS5Padding 45 cipher.init(2, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES")); 46 byte[] result = cipher.doFinal(bytes); 47 return new String(result, StandardCharsets.UTF_8); 48 } 49 } catch (Exception e) { 50 log.error("encrypt error", AESUtils.class, new Object[]{e}); 51 return null; 52 } 53 } 54 55 private static String base64Encode(byte[] bytes) { 56 return new String(Base64.encodeBase64(bytes), StandardCharsets.UTF_8); 57 } 58 59 private static byte[] base64Decode(String base64Value) { 60 byte[] decode = base64Value.getBytes(StandardCharsets.UTF_8); 61 return null != decode ? Base64.decodeBase64(decode) : new byte[0]; 62 } 63 64 private static String encryptKey(String key) { 65 return EmptyUtils.isEmpty(base64Decode(key)) ? null : new String(base64Decode(key), StandardCharsets.UTF_8); 66 }

浙公网安备 33010602011771号