[PHP] AES encryption----php Server and Android client
Last Update:2015-07-16
Source: Internet
Author: User
<span id="Label3"></p><p><p>This article takes 128-bit AES-CBC mode encryption and decryption</p></p><p><p>1. First install the MCrypt on the Server:</p></p><p><p><span style="font-size: 18px;"><code>sudo apt-get install php5-mcrypt php5-dev</code></span></p></p><p><p>sudo php5enmod mcrypt</p></p><p><p>sudo service apache2 restart</p></p><p><p>2.PHP service-side AES Encryption Class code</p></p><pre class="brush:php;gutter:true;">Class MCrypt {private $iv = ' fedcba9876543210 ';//initialization Vector IV public $KEY;//AES encrypted key key/ /transfer key $key into this class function __construct ($key) {$this->key= $key; }//cryptographic function Encrypt ($str) {//$key = $this->hex2bin ($key); $iv = $this->iv; $TD = Mcrypt_module_open (' rijndael-128 ', ', ' CBC ', $iv); Mcrypt_generic_init ($td, $this->key, $iv); $encrypted = Mcrypt_generic ($td, $str); \ocp\util::writelog (' ***mcrypt $key * * *, $this->key, \ocp\util::error); Mcrypt_generic_deinit ($td); Mcrypt_module_close ($td); return Bin2Hex ($encrypted); }//decryption function Decrypt ($code) {//$key = $this->hex2bin ($key); $code = $this->hex2bin ($code); $iv = $this->iv; $TD = MCrypt_module_open (' rijndael-128 ', ', ' CBC ', $iv); Mcrypt_generic_init ($td, $this->key, $iv); $decrypted = Mdecrypt_generic ($td, $code); Mcrypt_generic_deinit ($td); Mcrypt_module_close ($td); return Utf8_encode (trim ($decrypted)); } protected function Hex2bin ($hexdata) {$bindata = '; For ($i = 0; $i < strlen ($hexdata); $i + = 2) {$bindata. = chr (hexdec (substr ($hexdata, $i, 2))); } return $bindata; } }</pre><p><p>4.PHP Server calls the ASE encryption class Code:</p></p><pre><pre><span style="color: #800080;">$key</span>= ""<span style="color: #000000;">;//add The AES key yourself</span> <span style="color: #008000;">//</span> <span style="color: #008000;">Pass the encrypted key into the AES class</span> <span style="color: #800080;">$mcrypt</span><span style="color: #0000ff;">new</span> mcrypt (<span style="color: #800080;">$ Key</span><span style="color: #000000;">);</span> <span style="color: #008000;">//</span> <span style="color: #008000;">AES encryption of passwords in the database</span> <span style="color: #800080;">$PSW</span> <span style="color: #800080;">$mcrypt</span>->encrypt ();</pre></pre><p><p>5.Android service-side AES Decryption code:</p></p><p><p>Create a Aesutil class in Android that needs to be called when</p></p><pre><span style="color: #008000;"><span style="color: #008000;">/**</span></span><span style="color: #008000;"><span style="color: #008000;">* AES Decryption: * Decryption of the password sent back by the server *</span></span><span style="color: #008000;"><span style="color: #008000;">*/</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Import</span></span><span style="color: #000000;"><span style="color: #000000;">java.io.UnsupportedEncodingException;</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Import</span></span><span style="color: #000000;"><span style="color: #000000;">java.security.MessageDigest;</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Import</span></span><span style="color: #000000;"><span style="color: #000000;">java.security.NoSuchAlgorithmException;</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Import</span></span><span style="color: #000000;"><span style="color: #000000;">javax.crypto.Cipher;</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Import</span></span><span style="color: #000000;"><span style="color: #000000;">javax.crypto.NoSuchPaddingException;</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Import</span></span><span style="color: #000000;"><span style="color: #000000;">javax.crypto.spec.IvParameterSpec;</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Import</span></span><span style="color: #000000;"><span style="color: #000000;">javax.crypto.spec.SecretKeySpec;</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Import</span></span><span style="color: #000000;"><span style="color: #000000;">com.pcloud.android.ui.activity.FirstAuthenActivity;</span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">class</span></span><span style="color: #000000;"><span style="color: #000000;">Aesutil {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span>String IV = "fedcba9876543210";<span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">the virtual Iv. And the service side to maintain consistency</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span><span style="color: #000000;"><span style="color: #000000;">Ivparameterspec ivspec; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span><span style="color: #000000;"><span style="color: #000000;">Secretkeyspec keyspec; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span><span style="color: #000000;"><span style="color: #000000;">Cipher Cipher; </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">private String Secretkey = "";</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">the virtual</span> key</span>String msgtoken=<span style="color: #000000;"><span style="color: #000000;">firstauthenactivity.msgtoken; </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">String msgurl=firstauthenactivity.msgurl;</span></span>String msgrandom=<span style="color: #000000;"><span style="color: #000000;">firstauthenactivity.msgrandom; </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">take the random number and Tokenid to the MD5 operation as the AES key, and the service side of the AES encryption key to maintain consistency</span></span>String SECRETKEY=STRINGTOMD5 (msgtoken+<span style="color: #000000;"><span style="color: #000000;">msgrandom); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span><span style="color: #000000;"><span style="color: #000000;">aesutil () {ivspec</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span><span style="color: #000000;"><span style="color: #000000;">Ivparameterspec (iv.getbytes ()); Keyspec</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span>Secretkeyspec (secretkey.getbytes (), "AES"<span style="color: #000000;"><span style="color: #000000;">); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Try</span></span><span style="color: #000000;"><span style="color: #000000;">{cipher</span></span>= Cipher.getinstance ("aes/cbc/nopadding"<span style="color: #000000;"><span style="color: #000000;">); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Catch</span></span><span style="color: #000000;"><span style="color: #000000;">(nosuchalgorithmexception E) {</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">TODO auto-generated Catch block</span></span><span style="color: #000000;"><span style="color: #000000;">E.printstacktrace (); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Catch</span></span><span style="color: #000000;"><span style="color: #000000;">(nosuchpaddingexception E) {</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">TODO auto-generated Catch block</span></span><span style="color: #000000;"><span style="color: #000000;">E.printstacktrace (); } } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">byte</span></span>[] Encrypt (String Text)<span style="color: #0000ff;"><span style="color: #0000ff;">throws</span></span><span style="color: #000000;"><span style="color: #000000;">Exception {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(text = =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span>|| Text.length () = = 0<span style="color: #000000;"><span style="color: #000000;">) </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Throw</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span>Exception ("Empty string"<span style="color: #000000;"><span style="color: #000000;">); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">byte</span></span>[] encrypted =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Try</span></span><span style="color: #000000;"><span style="color: #000000;">{cipher.init (cipher.encrypt_mode, keyspec, ivspec); Encrypted</span></span>=<span style="color: #000000;"><span style="color: #000000;">cipher.dofinal (padstring (text). getBytes ()); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Catch</span></span><span style="color: #000000;"><span style="color: #000000;">(Exception E) {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Throw</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span>Exception ("[encrypt]" +<span style="color: #000000;"><span style="color: #000000;">E.getmessage ()); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">encrypted; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">byte</span></span>[] Decrypt (String Code)<span style="color: #0000ff;"><span style="color: #0000ff;">throws</span></span><span style="color: #000000;"><span style="color: #000000;">Exception {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(code = =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span>|| Code.length () = = 0<span style="color: #000000;"><span style="color: #000000;">) </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Throw</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span>Exception ("Empty string"<span style="color: #000000;"><span style="color: #000000;">); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">byte</span></span>[] decrypted =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Try</span></span><span style="color: #000000;"><span style="color: #000000;">{cipher.init (cipher.decrypt_mode, keyspec, ivspec); Decrypted</span></span>=<span style="color: #000000;"><span style="color: #000000;">cipher.dofinal (hextobytes (code)); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Catch</span></span><span style="color: #000000;"><span style="color: #000000;">(Exception E) {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Throw</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span>Exception ("[decrypt]" +<span style="color: #000000;"><span style="color: #000000;">E.getmessage ()); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">decrypted; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span>String Bytestohex (<span style="color: #0000ff;"><span style="color: #0000ff;">byte</span></span><span style="color: #000000;"><span style="color: #000000;">[] Data) { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(data==<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">) { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>Len =<span style="color: #000000;"><span style="color: #000000;">data.length; String Str</span></span>= ""<span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> for</span>(<span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>i=0; i<len; i++<span style="color: #000000;"><span style="color: #000000;">) { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>((data[i]&0xff) <16<span style="color: #000000;"><span style="color: #000000;">) Str</span></span>= str + "0" + java.lang.Integer.toHexString (data[i]&0xff<span style="color: #000000;"><span style="color: #000000;">); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Else</span></span><span style="color: #000000;"><span style="color: #000000;">Str</span></span>= str + java.lang.Integer.toHexString (data[i]&0xff<span style="color: #000000;"><span style="color: #000000;">); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">str; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">byte</span></span><span style="color: #000000;"><span style="color: #000000;">[] hextobytes (String str) {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(str==<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">) { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Else</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(str.length () < 2<span style="color: #000000;"><span style="color: #000000;">) { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Else</span></span><span style="color: #000000;"><span style="color: #000000;"> { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>Len = Str.length ()/2<span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">byte</span></span>[] buffer =<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">byte</span></span><span style="color: #000000;"><span style="color: #000000;">[len]; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> for</span>(<span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>i=0; i<len; i++<span style="color: #000000;"><span style="color: #000000;">) {buffer[i]</span></span>= (<span style="color: #0000ff;"><span style="color: #0000ff;">byte</span></span>) Integer.parseint (str.substring (i*2,i*2+2), 16<span style="color: #000000;"><span style="color: #000000;">); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">buffer; } } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">string padstring (string source) {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Char</span></span>Paddingchar = ' '<span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>size = 16<span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>x = Source.length ()%<span style="color: #000000;"><span style="color: #000000;">size; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>Padlength = size-<span style="color: #000000;"><span style="color: #000000;">x; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> for</span>(<span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>i = 0; I < padlength; i++<span style="color: #000000;"><span style="color: #000000;">) {source</span></span>+=<span style="color: #000000;"><span style="color: #000000;">paddingchar; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">source; }</span></span></pre><p><p>The 6.Android client calls the AES class for decryption:</p></p><pre><pre><span style="color: #008000;">//</span> <span style="color: #008000;">invoke AES Decryption</span> <span style="color: #000000;"> aesutil mcrypt; </span> <span style="color: #0000ff;">New</span> <span style="color: #000000;">aesutil (); </span> <span style="color: #0000ff;">Try</span> <span style="color: #000000;">{ </span><span style="color: #008000;">//</span> <span style="color: #008000;">AES Decryption of received password</span> <span style="color: #0000ff;">new</span> String (mcrypt.decrypt (rec[1<span style="color: #000000;">])); LOG.D (</span>"decrypted:"<span style="color: #000000;">, decrypted); </span> <span style="color: #0000ff;">Catch</span> <span style="color: #000000;">(Exception e) { </span><span style="color: #008000;">//</span> <span style="color: #008000;"> TODO auto-generated catch block</span> <span style="color: #000000;"> e.printstacktrace (); }</span></pre></pre><p><p></p></p><p><p> [php]aes Encrypted----PHP Server and Android client </p> </p></span>