zoukankan      html  css  js  c++  java
  • DES CBC java加密 php解密

    java DES-CBC 加解密代码:

    package cn.sh.ideal.util;
    
    import java.io.IOException;
    import java.net.URLEncoder;
    import java.security.Key;
    import java.security.SecureRandom;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.ResourceBundle;
    
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    import org.apache.commons.codec.binary.Base64;
    
    import sun.misc.BASE64Decoder;
    
    public class DesUtil {
    
        private static byte[] IV = { 0x12, 0x34, 0x56, 0x78, (byte) 0x90,
                (byte) 0xAB, (byte) 0xCD, (byte) 0xEF };
    
        /**
         * 加密
         * @param data 待加密的明文
         * @param key 加密密钥
         * @return 密文
         * @throws Exception
         */
        public static String encrypt(String data, String key) throws Exception {
            SecureRandom sr = new SecureRandom();
            DESKeySpec ks = new DESKeySpec(key.getBytes("UTF-8"));
            SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
            SecretKey sk = skf.generateSecret(ks);
            Cipher cip = Cipher.getInstance("DES/CBC/PKCS5Padding");// Cipher.getInstance("DES");
            IvParameterSpec ivSpec = new IvParameterSpec(IV);
            cip.init(Cipher.ENCRYPT_MODE, sk, ivSpec);// IV的方式
            // cip.init(Cipher.ENCRYPT_MODE, sk, sr);//没有传递IV
            return new String(new Base64().encode(cip.doFinal(data
                    .getBytes("UTF-8"))));
    
        }
    
        /**
         * 解密
         * @param data 待解密的密文
         * @param key 解密密钥
         * @return 明文
         * @throws IOException
         * @throws Exception
         */
        public static String decrypt(String data, String key) throws IOException,
                Exception {
            if (data == null) {
                return null;
            }
    
            byte[] buf = new Base64().decode(data.getBytes("UTF-8"));
    
            SecureRandom sr = new SecureRandom();
    
            DESKeySpec dks = new DESKeySpec(key.getBytes("UTF-8"));
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey securekey = keyFactory.generateSecret(dks);
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            IvParameterSpec ivSpec = new IvParameterSpec(IV);
            cipher.init(Cipher.DECRYPT_MODE, securekey, ivSpec);
    
            // cipher.init(Cipher.DECRYPT_MODE, securekey, sr);//没有传递IV
    
            return new String(cipher.doFinal(buf));
        }
    
        public static void main(String[] args) throws Exception {
            String desKey = "1A426B316FB648";
            String params = "1383838438";
            System.out.println("原文:"+params);
            System.out.println("密码:"+desKey);
            String encryptStr = DesUtil.encrypt(params,desKey).replace("+","A_a");
            System.out.println("加密后:"+encryptStr);
            String decryptStr = DesUtil.decrypt(encryptStr.replace("A_a", "+"), desKey);
            System.out.println("解密后:"+decryptStr);
            
    
        }
    
    }

    php DES-CBC加解密代码(需要开启openssl php扩展):

    $iv = "x12x34x56x78x90xABxCDxEF.";
    $str = "13838384388";
    $en_str = openssl_encrypt($str, 'des-cbc', "1A426B316FB648",0,$iv);
    echo $en_str."<br/>";
    $de_str = openssl_decrypt($en_str, 'des-cbc', "1A426B316FB648",0,$iv);
    echo $de_str;

    附 php AES加解密代码:

    class AESMcrypt{
    
    
        /** 
         * 设置默认的加密key 32位
         * @var str 
         * 为了保密省略后半部分
         */ 
        private static $defaultKey = "1A426B316FB648";
    
        /** 
         * 设置默认加密向量
         * @var str
         * 为了保密省略后半部分
         */
         
        //在.net/java中的格式为
        //$iv='{ 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}';
        
        private $iv = "x12x34x56x78x90xABxCDxEF.";
         
        /** 
         * 设置加密算法 
         * @var str 
         */ 
        private $cipher; 
         
        /** 
         * 设置加密模式 
         * @var str 
         */ 
        private $mode; 
         
        public function __construct($cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC){ 
            $this->cipher = $cipher; 
            $this->mode = $mode; 
        } 
         
        /** 
         * 对内容加密,注意此加密方法中先对内容使用padding pkcs7,然后再加密。 
         * @param str $content    需要加密的内容 
         * @return str 加密后的密文 
         */ 
        public function encrypt($content){ 
            if(empty($content)){
                return null; 
            }
            
            $srcdata = $this->addPkcs7Padding($content);
            return mcrypt_encrypt($this->cipher, $this->getSecretKey(), $srcdata, $this->mode, $this->iv);
        }
        
        /**
         * pkcs7补码
         *
         * @param string $string  明文
         *
         * @return String
         */ 
        function addPkcs7Padding($string) {
            $blocksize = mcrypt_get_block_size($this->cipher, $this->mode);
            $len = strlen($string); //取得字符串长度
            $pad = $blocksize - ($len % $blocksize); //取得补码的长度
            $string .= str_repeat(chr($pad), $pad); //用ASCII码为补码长度的字符, 补足最后一段
            return $string;
        }
    
        /** 
         * 对内容解密,注意此加密方法中先对内容解密。再对解密的内容使用padding pkcs7去除特殊字符。 
         * @param String $content    需要解密的内容 
         * @return String 解密后的内容 
         */ 
        public function decrypt($content){ 
            if(empty($content)){ 
                return null; 
            } 
    
            $content = mcrypt_decrypt($this->cipher, $this->getSecretKey(), $content, $this->mode, $this->iv); 
            //$block = mcrypt_get_block_size($this->cipher, $this->mode); 
            $pad = ord($content[($len = strlen($content)) - 1]); 
            return substr($content, 0, strlen($content) - $pad); 
        }
        
        public function getSecretKey()
        {
            return self::$defaultKey;
        }
    }
  • 相关阅读:
    [NOIP2010] 引水入城
    BZOJ 3038 线段树
    [Tyvj 1728]普通平衡树 5种姿势 (彩蛋)
    BZOJ 1588: [HNOI2002]营业额统计
    BZOJ 2141 排队 线段树套替罪羊
    BZOJ 3629 [JLOI2014] 聪明的燕姿 dfs
    P1546 [USACO3.1]最短网络 Agri-Net(洛谷)
    并查集详解+模板
    sync_with_stdio和cin.tie(0); cout.tie(0);
    拓扑排序详解
  • 原文地址:https://www.cnblogs.com/jiafeimao-dabai/p/10194318.html
Copyright © 2011-2022 走看看