Java和PHP加解密

Posted 水杉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java和PHP加解密相关的知识,希望对你有一定的参考价值。

php代码

 1 <?php
 2 //DES加解密工具
 3 class DesEncrypt {
 4     var $key;
 5     var $iv;
 6     function DesEncrypt($key, $iv=0) {
 7         $this->key = $key;
 8         if($iv == 0){
 9             $this->iv = $key;
10         }else{
11             $this->iv = $iv;
12         }
13     }
14     function encrypt($input) {
15         $size = mcrypt_get_block_size(‘des‘, ‘ecb‘);
16         $input = $this->pkcs5_pad($input, $size);
17         $td = mcrypt_module_open(‘des‘, ‘‘, ‘ecb‘, ‘‘);
18         $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
19         @mcrypt_generic_init($td, $this->key, $iv);
20         $data = mcrypt_generic($td, $input);
21         mcrypt_generic_deinit($td);
22         mcrypt_module_close($td);
23         $data = base64_encode($data);
24         return $data;
25 
26     }
27     function decrypt($encrypted) {
28         $encrypted = base64_decode($encrypted);
29         $td = mcrypt_module_open(‘des‘,‘‘,‘ecb‘,‘‘);
30         //使用MCRYPT_DES算法,cbc模式
31         $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
32         $ks = mcrypt_enc_get_key_size($td);
33         $key = substr($this->key, 0, $ks);
34         $rs = @mcrypt_generic_init($td, $key, $iv);
35         //初始处理
36         $decrypted = mdecrypt_generic($td, $encrypted);
37         //解密
38         mcrypt_generic_deinit($td);
39         //结束
40         mcrypt_module_close($td);
41         $y=$this->pkcs5_unpad($decrypted);
42         return $y;
43     }
44     function pkcs5_pad ($text, $blocksize) {
45         $pad = $blocksize - (strlen($text) % $blocksize);
46         return $text . str_repeat(chr($pad), $pad);
47     }
48     function pkcs5_unpad($text) {
49         $pad = ord($text{strlen($text)-1});
50         if ($pad > strlen($text))
51             return false;
52         if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)
53             return false;
54         return substr($text, 0, -1 * $pad);
55     }
56 }
57 
58 $key = "123456789012345678901234567890123456";  //36位
59 $crypt = new DesEncrypt($key);
60 $str = "中国";
61 $mstr = $crypt->encrypt($str);
62 echo "密文:" . $mstr . "<br/>";
63 
64 $str = $crypt->decrypt($mstr);
65 echo "明文:" . $str;

 

结果:

密文:Rm+8trB4CBQ=
明文:中国

 

Java代码

  1 package com.util;
  2 import java.security.Key;
  3 import java.security.SecureRandom;
  4 
  5 import javax.crypto.Cipher;
  6 import javax.crypto.SecretKeyFactory;
  7 import javax.crypto.spec.DESKeySpec;
  8 
  9 import org.apache.commons.codec.binary.Base64;
 10 
 11 import com.util.DesEncrypt;
 12 
 13 /**
 14  * 加密解密
 15  * @author bian
 16  * 2015 上午11:13:36
 17  */
 18 public class DesEncrypt {
 19     Key key;
 20     public DesEncrypt(String str) {
 21         try{
 22             String key = str;
 23             setKey(key);// 生成密匙
 24         }catch(Exception e){
 25              
 26         }
 27     }
 28 
 29     public DesEncrypt() {
 30         setKey("heimazhifuqw233344");
 31     }
 32 
 33     /**
 34      * 根据参数生成KEY
 35      */
 36     public void setKey(String strKey) {
 37         try {
 38             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
 39             this.key  = keyFactory.generateSecret(new DESKeySpec(strKey.getBytes("UTF8")));
 40         } catch (Exception e) {
 41             throw new RuntimeException(
 42                     "Error initializing SqlMap class. Cause: " + e);
 43         }
 44     }
 45 
 46     
 47     /**
 48      * 加密String明文输入,String密文输出
 49      */
 50     public String encrypt(String strMing) {
 51         byte[] byteMi = null;
 52         byte[] byteMing = null;
 53         String strMi = "";
 54         //BASE64Encoder base64en = new BASE64Encoder();
 55         try {
 56             byteMing = strMing.getBytes("UTF8");
 57             byteMi = this.getEncCode(byteMing);
 58             strMi = new String(Base64.encodeBase64(byteMi), "UTF8");
 59         } catch (Exception e) {
 60             throw new RuntimeException(
 61                     "Error initializing SqlMap class. Cause: " + e);
 62         } finally {
 63             //base64en = null;
 64             byteMing = null;
 65             byteMi = null;
 66         }
 67         return strMi;
 68     }
 69 
 70     /**
 71      * 解密 以String密文输入,String明文输出
 72      * 
 73      * @param strMi
 74      * @return
 75      */
 76     public String decrypt(String strMi) {
 77         ///BASE64Decoder base64De = new BASE64Decoder();
 78         byte[] byteMing = null;
 79         byte[] byteMi = null;
 80         String strMing = "";
 81         try {
 82             byteMi = Base64.decodeBase64(strMi);
 83             byteMing = this.getDesCode(byteMi);
 84             strMing = new String(byteMing, "UTF8");
 85         } catch (Exception e) {
 86             throw new RuntimeException(
 87                     "Error initializing SqlMap class. Cause: " + e);
 88         } finally {
 89             //base64De = null;
 90             byteMing = null;
 91             byteMi = null;
 92         }
 93         return strMing;
 94     }
 95 
 96     /**
 97      * 加密以byte[]明文输入,byte[]密文输出
 98      * 
 99      * @param byteS
100      * @return
101      */
102     private byte[] getEncCode(byte[] byteS) {
103         byte[] byteFina = null;
104         Cipher cipher;
105         try {
106             cipher = Cipher.getInstance("DES");
107             cipher.init(Cipher.ENCRYPT_MODE, key,SecureRandom.getInstance("SHA1PRNG"));
108             byteFina = cipher.doFinal(byteS);
109         } catch (Exception e) {
110             throw new RuntimeException(
111                     "Error initializing SqlMap class. Cause: " + e);
112         } finally {
113             cipher = null;
114         }
115         return byteFina;
116     }
117 
118     /**
119      * 解密以byte[]密文输入,以byte[]明文输出
120      * 
121      * @param byteD
122      * @return
123      */
124     private byte[] getDesCode(byte[] byteD) {
125         Cipher cipher;
126         byte[] byteFina = null;
127         try {
128             cipher = Cipher.getInstance("DES");
129             cipher.init(Cipher.DECRYPT_MODE, key,SecureRandom.getInstance("SHA1PRNG"));
130             byteFina = cipher.doFinal(byteD);
131         } catch (Exception e) {
132             throw new RuntimeException(
133                     "Error initializing SqlMap class. Cause: " + e);
134         } finally {
135             cipher = null;
136         }
137         return byteFina;
138     }
139 
140     
141 
142     public static void main(String args[])  {
143         String key = "123456789012345678901234567890123456";//36位
144         String str = "中国";
145         DesEncrypt des = new DesEncrypt(key);    
146         
147         // DES加密
148         String mStr =   des.encrypt(str);
149         // DES解密
150         String deStr = des.decrypt(mStr);
151         
152         System.out.println("密文:" + mStr);
153         System.out.println("明文:" + deStr);
154     }
155 }

 

结果:

密文:Rm+8trB4CBQ=
明文:中国

 

以上是关于Java和PHP加解密的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何实现AES加解密

rsa互通密钥对生成及互通加解密(c#,java,php)

java进行3des加密传过来的数据,php怎么解密?

记一次Java加密加签算法到php的坑

Android、PHP和node.js之间的加解密

php升级到7.+之后openssl替代mcrypt实现解密