Android 和 PHP 之间进行数据加密传输
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 |

浙公网安备 33010602011771号