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

news/2024/7/3 13:35:57 标签: java, php, 加密, 解密

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

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版代码如下:

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


http://www.niftyadmin.cn/n/1833230.html

相关文章

Android Animation动画详解(一): 补间动画

前言 你有没有被一些APP中惊艳的动画效果震撼过&#xff0c;有没有去思考&#xff0c;甚至研究过这些动画是如何实现的呢&#xff1f; 啥&#xff1f;你没有思考&#xff0c;更没有研究过&#xff1f; 好吧&#xff0c;那跟着我一起来学习下如何去实现APP中那些让我们惊羡的动画…

pyrhon微信小程序(二)

接一&#xff0c;继续学习。和大家一起学习进步。 学习全局配置。 属性 类型 描述 entryPagePath string 小程序默认启动首页 pages string[] 页面路径列表 window Object 全局的默认窗口表现 tabBar Object 底部 tab 栏的表现 networkTimeout Object 网络超时时间 debug…

spring jap分页+枚举转换

jpa分页转换 Overridepublic Page<OrderDto> findAll(Pageable pageable) {Page<OrderMaster> pager orderMasterRepostry.findAll(pageable);List<OrderMaster> orderMasters pager.getContent();List<OrderDto> orderDtos new ArrayList<>(…

php中-箭头的用法和意义

引用一个类的属性和方法就使用->符号。->是调用的意思类 -> 类的成员变量或者成员函数 如果得到的结果是对象的话就用-> 名称 来输出内容 如果得到的结果是数组的话就用 myarray[] 来输出 程序:while ($property mysql_fetch_field($row)){ print_r($property);ec…

python多线程多进程讲解

时隔多天&#xff0c;又开始新的内容&#xff0c;欢迎大家评论&#xff0c;一起学习&#xff0c;一起进步。 进程与线程的关系&#xff1a;操作系统执行一个程序时&#xff0c;都会释放一个内存&#xff0c;而这个内存区域就可以说是xxx进程&#xff0c;进程里有许多的线程工作…

freemarker(FTL)常见语法大全

FreeMarker的插值有如下两种类型: 1,通用插值${expr}; 2,数字格式化插值:#{expr}或#{expr;format} 通用插值&#xff1a; ${book.name?if_exists } //用于判断如果存在,就输出这个值 ${book.name?default(‘xxx’)} //默认值xxx ${book.name!”xxx”} //默认值xxx ${b…

2012 jinhua

2012 jinhua I题&#xff1a;签到题&#xff0c;没什么意思。 #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstdlib>using namespace std;const int maxn1000100;int n; int a[maxn];int main() {whil…

ORCLE 如何停止一个JOB【HOW TO STOP A JOB IN THE ORACLE】

为同事解决一个因为网络连接情况不佳时&#xff0c;执行一个超长时间的SQL插入操作。 既然网络状况不好&#xff0c;就选择了使用一次性使用JOB来完成该插入操作。在JOB执行一段时间后&#xff0c;我发现被插入表有些问题&#xff08;惭愧&#xff0c;当时也没有先检查检查…