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 = "\x12\x34\x56\x78\x90\xAB\xCD\xEF\.";
$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 = "\x12\x34\x56\x78\x90\xAB\xCD\xEF\.";
     
    /** 
     * 设置加密算法 
     * @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;
    }
}