php 与java通用AES加密解密算法

转自:https://www.cnblogs.com/grimm/p/7233050.html

defined('INDEX_BLOCK_LENGTH')   or define('INDEX_BLOCK_LENGTH',  12);
defined('TOTAL_HEADER_LENGTH')  or define('TOTAL_HEADER_LENGTH', 8192);
class AesController
{
    protected $cipher = MCRYPT_RIJNDAEL_128;
    protected $mode = MCRYPT_MODE_ECB;
    protected $pad_method = 'pkcs5';
    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;
    }
    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);
        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, base64_decode($str));
        $rt = $decrypted_text;
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return $this->unpad($rt);
    }
    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);
    }
}

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);

 

    }

}

你可能感兴趣的:(php)