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     }

 

posted @ 2024-11-14 17:41  涵&浩  阅读(395)  评论(0)    收藏  举报