Android 和 PHP 之间进行数据加密传输
[代码] [Java]代码
1 | mcrypt = new MCrypt(); |
2 | /* Encrypt */ |
3 | String encrypted = MCrypt.bytesToHex( mcrypt.encrypt("Text to Encrypt") ); |
4 | /* Decrypt */ |
5 | String decrypted = new String( mcrypt.decrypt( encrypted ) ); |
[代码] [PHP]代码
1 | $mcrypt = new MCrypt(); |
2 | #Encrypt |
3 | $encrypted = $mcrypt->encrypt("Text to encrypt"); |
4 | #Decrypt |
5 | $decrypted = $mcrypt->decrypt($encrypted); |
[代码] MCrypt.java
001 | /***********/ |
002 | /**JAVA**/ |
003 |
004 | import java.security.NoSuchAlgorithmException; |
005 |
006 | import javax.crypto.Cipher; |
007 | import javax.crypto.NoSuchPaddingException; |
008 | import javax.crypto.spec.IvParameterSpec; |
009 | import javax.crypto.spec.SecretKeySpec; |
010 |
011 | public class MCrypt { |
012 |
013 | private String iv = "fedcba9876543210";//Dummy iv (CHANGE IT!) |
014 | private IvParameterSpec ivspec; |
015 | private SecretKeySpec keyspec; |
016 | private Cipher cipher; |
017 |
018 | private String SecretKey = "0123456789abcdef";//Dummy secretKey (CHANGE IT!) |
019 |
020 | public MCrypt() |
021 | { |
022 | ivspec = new IvParameterSpec(iv.getBytes()); |
023 |
024 | keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES"); |
025 |
026 | try { |
027 | cipher = Cipher.getInstance("AES/CBC/NoPadding"); |
028 | } catch (NoSuchAlgorithmException e) { |
029 | // TODO Auto-generated catch block |
030 | e.printStackTrace(); |
031 | } catch (NoSuchPaddingException e) { |
032 | // TODO Auto-generated catch block |
033 | e.printStackTrace(); |
034 | } |
035 | } |
036 |
037 | public byte[] encrypt(String text) throws Exception |
038 | { |
039 | if(text == null || text.length() == 0) |
040 | throw new Exception("Empty string"); |
041 |
042 | byte[] encrypted = null; |
043 |
044 | try { |
045 | cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); |
046 |
047 | encrypted = cipher.doFinal(padString(text).getBytes()); |
048 | } catch (Exception e) |
049 | { |
050 | throw new Exception("[encrypt] " + e.getMessage()); |
051 | } |
052 |
053 | return encrypted; |
054 | } |
055 |
056 | public byte[] decrypt(String code) throws Exception |
057 | { |
058 | if(code == null || code.length() == 0) |
059 | throw new Exception("Empty string"); |
060 |
061 | byte[] decrypted = null; |
062 |
063 | try { |
064 | cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); |
065 |
066 | decrypted = cipher.doFinal(hexToBytes(code)); |
067 | } catch (Exception e) |
068 | { |
069 | throw new Exception("[decrypt] " + e.getMessage()); |
070 | } |
071 | return decrypted; |
072 | } |
073 |
074 |
075 |
076 | public static String bytesToHex(byte[] data) |
077 | { |
078 | if (data==null) |
079 | { |
080 | return null; |
081 | } |
082 |
083 | int len = data.length; |
084 | String str = ""; |
085 | for (int i=0; i<len; i++) { |
086 | if ((data[i]&0xFF)<16) |
087 | str = str + "0" + java.lang.Integer.toHexString(data[i]&0xFF); |
088 | else |
089 | str = str + java.lang.Integer.toHexString(data[i]&0xFF); |
090 | } |
091 | return str; |
092 | } |
093 |
094 |
095 | public static byte[] hexToBytes(String str) { |
096 | if (str==null) { |
097 | return null; |
098 | } else if (str.length() < 2) { |
099 | return null; |
100 | } else { |
101 | int len = str.length() / 2; |
102 | byte[] buffer = new byte[len]; |
103 | for (int i=0; i<len; i++) { |
104 | buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16); |
105 | } |
106 | return buffer; |
107 | } |
108 | } |
109 |
110 |
111 |
112 | private static String padString(String source) |
113 | { |
114 | char paddingChar = ' '; |
115 | int size = 16; |
116 | int x = source.length() % size; |
117 | int padLength = size - x; |
118 |
119 | for (int i = 0; i < padLength; i++) |
120 | { |
121 | source += paddingChar; |
122 | } |
123 |
124 | return source; |
125 | } |
126 | } |
[代码] mcrypt.php
01 | /**********/ |
02 | /**PHP**/ |
03 |
04 | <?php |
05 |
06 | class MCrypt |
07 | { |
08 | private $iv = 'fedcba9876543210'; #Same as in JAVA |
09 | private $key = '0123456789abcdef'; #Same as in JAVA |
10 |
11 |
12 | function __construct() |
13 | { |
14 | } |
15 |
16 | function encrypt($str) { |
17 |
18 | //$key = $this->hex2bin($key); |
19 | $iv = $this->iv; |
20 |
21 | $td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv); |
22 |
23 | mcrypt_generic_init($td, $this->key, $iv); |
24 | $encrypted = mcrypt_generic($td, $str); |
25 |
26 | mcrypt_generic_deinit($td); |
27 | mcrypt_module_close($td); |
28 |
29 | return bin2hex($encrypted); |
30 | } |
31 |
32 | function decrypt($code) { |
33 | //$key = $this->hex2bin($key); |
34 | $code = $this->hex2bin($code); |
35 | $iv = $this->iv; |
36 |
37 | $td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv); |
38 |
39 | mcrypt_generic_init($td, $this->key, $iv); |
40 | $decrypted = mdecrypt_generic($td, $code); |
41 |
42 | mcrypt_generic_deinit($td); |
43 | mcrypt_module_close($td); |
44 |
45 | return utf8_encode(trim($decrypted)); |
46 | } |
47 |
48 | protected function hex2bin($hexdata) { |
49 | $bindata = ''; |
50 |
51 | for ($i = 0; $i < strlen($hexdata); $i += 2) { |
52 | $bindata .= chr(hexdec(substr($hexdata, $i, 2))); |
53 | } |
54 |
55 | return $bindata; |
56 | } |
57 |
58 | } |
59 | // see http://androidsnippets.com/encrypt-decrypt-between-android-and-php |