zoukankan      html  css  js  c++  java
  • php与java通用AES加密解密算法

    AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的AES加密解密算法。

    php版代码如下:

    <?php
    class CryptAES
    {
        protected $cipher = MCRYPT_RIJNDAEL_128;
        protected $mode = MCRYPT_MODE_ECB;
        protected $pad_method = NULL;
        protected $secret_key = '';
        protected $iv = '';
     
        public function set_cipher($cipher)
        {
            $this->cipher = $cipher;
        }
     
        public function set_mode($mode)
        {
            $this->mode = $mode;
        }
     
        public function set_iv($iv)
        {
            $this->iv = $iv;
        }
     
        public function set_key($key)
        {
            $this->secret_key = $key;
        }
     
        public function require_pkcs5()
        {
            $this->pad_method = 'pkcs5';
        }
     
        protected function pad_or_unpad($str, $ext)
        {
            if ( is_null($this->pad_method) )
            {
                return $str;
            }
            else
            {
                $func_name = __CLASS__ . '::' . $this->pad_method . '_' . $ext . 'pad';
                if ( is_callable($func_name) )
                {
                    $size = mcrypt_get_block_size($this->cipher, $this->mode);
                    return call_user_func($func_name, $str, $size);
                }
            }
            return $str;
        }
     
        protected function pad($str)
        {
            return $this->pad_or_unpad($str, '');
        }
     
        protected function unpad($str)
        {
            return $this->pad_or_unpad($str, 'un');
        }
     
        public function encrypt($str)
        {
            $str = $this->pad($str);
            $td = mcrypt_module_open($this->cipher, '', $this->mode, '');
     
            if ( empty($this->iv) )
            {
                $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
            }
            else
            {
                $iv = $this->iv;
            }
     
            mcrypt_generic_init($td, $this->secret_key, $iv);
            $cyper_text = mcrypt_generic($td, $str);
            $rt=base64_encode($cyper_text);
            //$rt = bin2hex($cyper_text);
            mcrypt_generic_deinit($td);
            mcrypt_module_close($td);
     
            return $rt;
        }
     
        public function decrypt($str){
            $td = mcrypt_module_open($this->cipher, '', $this->mode, '');
     
            if ( empty($this->iv) )
            {
                $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
            }
            else
            {
                $iv = $this->iv;
            }
     
            mcrypt_generic_init($td, $this->secret_key, $iv);
            //$decrypted_text = mdecrypt_generic($td, self::hex2bin($str));
            $decrypted_text = mdecrypt_generic($td, base64_decode($str));
            $rt = $decrypted_text;
            mcrypt_generic_deinit($td);
            mcrypt_module_close($td);
     
            return $this->unpad($rt);
        }
     
        public static function hex2bin($hexdata) {
            $bindata = '';
            $length = strlen($hexdata);
            for ($i=0; $i amp;< $length; $i += 2)
            {
                $bindata .= chr(hexdec(substr($hexdata, $i, 2)));
            }
            return $bindata;
        }
     
        public static function pkcs5_pad($text, $blocksize)
        {
            $pad = $blocksize - (strlen($text) % $blocksize);
            return $text . str_repeat(chr($pad), $pad);
        }
     
        public static function pkcs5_unpad($text)
        {
            $pad = ord($text{strlen($text) - 1});
            if ($pad > strlen($text)) return false;
            if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
            return substr($text, 0, -1 * $pad);
        }
    }
     
    $keyStr = 'UITN25LMUQC436IM';
    $plainText = 'this is a string will be AES_Encrypt';
     
    $aes = new CryptAES();
    $aes->set_key($keyStr);
    $aes->require_pkcs5();
    $encText = $aes->encrypt($plainText);
    $decString = $aes->decrypt($encText);
     
    echo $encText,"n",$decString;
     
    ?>
     

    运行结果:
    fhTD0NNIzv4jUEhJuC1htFFXJ/4S/rL6tDCJPiNvJ8mVLHWOD0HWweuxHynxoZf9
    this is a string will be AES_Encrypt

     
     java版的加解密算法:
    import java.security.Key; 
    import javax.crypto.Cipher; 
    import javax.crypto.spec.SecretKeySpec; 
     
    import org.apache.commons.codec.binary.Base64;
      
    public class CryptAES { 
      
        private static final String AESTYPE ="AES/ECB/PKCS5Padding"; 
     
        public static String AES_Encrypt(String keyStr, String plainText) { 
            byte[] encrypt = null; 
            try{ 
                Key key = generateKey(keyStr); 
                Cipher cipher = Cipher.getInstance(AESTYPE); 
                cipher.init(Cipher.ENCRYPT_MODE, key); 
                encrypt = cipher.doFinal(plainText.getBytes());     
            }catch(Exception e){ 
                e.printStackTrace(); 
            }
            return new String(Base64.encodeBase64(encrypt)); 
        } 
     
        public static String AES_Decrypt(String keyStr, String encryptData) {
            byte[] decrypt = null; 
            try{ 
                Key key = generateKey(keyStr); 
                Cipher cipher = Cipher.getInstance(AESTYPE); 
                cipher.init(Cipher.DECRYPT_MODE, key); 
                decrypt = cipher.doFinal(Base64.decodeBase64(encryptData)); 
            }catch(Exception e){ 
                e.printStackTrace(); 
            } 
            return new String(decrypt).trim(); 
        } 
     
        private static Key generateKey(String key)throws Exception{ 
            try{            
                SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES"); 
                return keySpec; 
            }catch(Exception e){ 
                e.printStackTrace(); 
                throw e; 
            } 
     
        } 
     
        public static void main(String[] args) { 
             
            String keyStr = "UITN25LMUQC436IM";  
     
            String plainText = "this is a string will be AES_Encrypt";
             
            String encText = AES_Encrypt(keyStr, plainText);
            String decString = AES_Decrypt(keyStr, encText); 
             
            System.out.println(encText); 
            System.out.println(decString); 
     
        } 
    }

    运行结果:
    fhTD0NNIzv4jUEhJuC1htFFXJ/4S/rL6tDCJPiNvJ8mVLHWOD0HWweuxHynxoZf9
    this is a string will be AES_Encrypt

     
  • 相关阅读:
    ADF中遍历VO中的行数据(Iterator)
    程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
    ArcGIS api for javascript——鼠标悬停时显示信息窗口
    ArcGIS api for javascript——查询,然后单击显示信息窗口
    ArcGIS api for javascript——查询,立刻打开信息窗口
    ArcGIS api for javascript——显示多个查询结果
    ArcGIS api for javascript——用图表显示查询结果
    ArcGIS api for javascript——查询没有地图的数据
    ArcGIS api for javascript——用第二个服务的范围设置地图范围
    ArcGIS api for javascript——显示地图属性
  • 原文地址:https://www.cnblogs.com/archoncap/p/5194335.html
Copyright © 2011-2022 走看看