兼容PHP和Java的des加密解密代码分享

5年以前  |  阅读数:549 次  |  编程语言:PHP 

php代码:


    <?php
    class DES
    {
        var $key;
        var $iv; //偏移量

        function DES($key, $iv=0)
        {
            $this->key = $key;
            if($iv == 0)
            {
                $this->iv = $key;
            }
            else 
            {
                $this->iv = $iv;
            }
        }

        //加密
        function encrypt($str)
        {       
            $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );
            $str = $this->pkcs5Pad ( $str, $size );

            $data=mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv);
            //$data=strtoupper(bin2hex($data)); //返回大写十六进制字符串
            return base64_encode($data);
        }

        //解密
        function decrypt($str)
        {
            $str = base64_decode ($str);
            //$strBin = $this->hex2bin( strtolower($str));
            $str = mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_DECRYPT, $this->iv );
            $str = $this->pkcs5Unpad( $str );
            return $str;
        }

        function hex2bin($hexData)
        {
            $binData = "";
            for($i = 0; $i < strlen ( $hexData ); $i += 2)
            {
                $binData .= chr(hexdec(substr($hexData, $i, 2)));
            }
            return $binData;
        }

        function pkcs5Pad($text, $blocksize)
        {
            $pad = $blocksize - (strlen ( $text ) % $blocksize);
            return $text . str_repeat ( chr ( $pad ), $pad );
        }

        function pkcs5Unpad($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 );
        }
    }
    $str = 'abcd';
    $key= 'asdfwef5';
    $crypt = new DES($key);
    $mstr = $crypt->encrypt($str);
    $str = $crypt->decrypt($mstr);

    echo $str.' <=> '.$mstr;

    ?>

java代码:


    package com.test;

    import it.sauronsoftware.base64.Base64;

    import java.security.Key;
    import java.security.SecureRandom;
    import java.security.spec.AlgorithmParameterSpec;

    import javax.crypto.Cipher;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import javax.crypto.spec.IvParameterSpec;

    public class Main
    {
     public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
     /**
      * DES算法,加密
      *
      * @param data 待加密字符串
      * @param key 加密私钥,长度不能够小于8位
      * @return 加密后的字节数组,一般结合Base64编码使用
      * @throws CryptException 异常
      */
     public static String encode(String key,String data) throws Exception
     {
      return encode(key, data.getBytes());
     }
     /**
      * DES算法,加密
      *
      * @param data 待加密字符串
      * @param key 加密私钥,长度不能够小于8位
      * @return 加密后的字节数组,一般结合Base64编码使用
      * @throws CryptException 异常
      */
     public static String encode(String key,byte[] data) throws Exception
     {
      try
      {
            DESKeySpec dks = new DESKeySpec(key.getBytes());

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
       //key的长度不能够小于8位字节
       Key secretKey = keyFactory.generateSecret(dks);
       Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
       IvParameterSpec iv = new IvParameterSpec(key.getBytes());
       AlgorithmParameterSpec paramSpec = iv;
       cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);

       byte[] bytes = cipher.doFinal(data);


    //   return byte2hex(bytes);
       return new String(Base64.encode(bytes));
      } catch (Exception e)
      {
       throw new Exception(e);
      }
     }

     /**
      * DES算法,解密
      *
      * @param data 待解密字符串
      * @param key 解密私钥,长度不能够小于8位
      * @return 解密后的字节数组
      * @throws Exception 异常
      */
     public static byte[] decode(String key,byte[] data) throws Exception
     {
      try
      {
        SecureRandom sr = new SecureRandom();
            DESKeySpec dks = new DESKeySpec(key.getBytes());
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
       //key的长度不能够小于8位字节
       Key secretKey = keyFactory.generateSecret(dks);
       Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
       IvParameterSpec iv = new IvParameterSpec(key.getBytes());
       AlgorithmParameterSpec paramSpec = iv;
       cipher.init(Cipher.DECRYPT_MODE, secretKey,paramSpec);
       return cipher.doFinal(data);
      } catch (Exception e)
      {
       throw new Exception(e);
      }
     }

     /**
      * 获取编码后的值
      * @param key
      * @param data
      * @return
      * @throws Exception
      */
     public static String decodeValue(String key,String data) 
     {
        byte[] datas;
        String value = null;
            try {

                datas = decode(key, Base64.decode(data.getBytes()));

                value = new String(datas);
            } catch (Exception e) {
                value = "";
            }
        return value;
     }

     public static void main(String[] args) throws Exception
     {
        System.out.println("明:abcd ;密:" + Main.encode("asdfwef5","abcd"));
     }
    }

PS:关于加密技术,本站还提供了如下加密工具供大家参考使用:

MD5在线加密工具:http://tools.jb51.net/password/CreateMD5Password

Escape加密/解密工具:http://tools.jb51.net/password/escapepwd

在线SHA1加密工具:http://tools.jb51.net/password/sha1encode

短链(短网址)在线生成工具:http://tools.jb51.net/password/dwzcreate

短链(短网址)在线还原工具:http://tools.jb51.net/password/unshorturl

高强度密码生成器:http://tools.jb51.net/password/CreateStrongPassword

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例