PHP DES/ECB/pkcs5padding加密,与java互通

环境:php5.6

最近遇到需要跟java系统实现des加密互通,网上找了很多,加密都不对,自己整理了一个des ecb加密类

java版代码如下:

	// 密钥,是加密解密的凭据,长度为8的倍数
	private static final String PASSWORD_CRYPT_KEY = "密钥";
	//加密方式是des
	private final static String DES = "DES";

	public static void main(String args[]) {
        String basestr = "panpan";
        String str1 = encrypt(basestr);

        System.out.println("原始值: " + basestr);
        System.out.println("加密后: " + str1);
        System.out.println("解密后: " + decrypt(str1));
        System.out.println("为空时 is : " + decrypt(encrypt("")));
    }

	/**
     * 加密
     * @param src 数据源
     * @param key 密钥,长度必须是8的倍数
     * @return 返回加密后的数据
     * @throws Exception
     */
    public static byte[] encrypt(byte[] src, byte[] key) throws Exception {
 
        // DES算法要求有一个可信任的随机数源
        SecureRandom sr = new SecureRandom();
 
        // 从原始密匙数据创建DESKeySpec对象
        DESKeySpec dks = new DESKeySpec(key);
 
        // 创建一个密匙工厂,然后用它把DESKeySpec转换成
        // 一个SecretKey对象
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
 
        SecretKey securekey = keyFactory.generateSecret(dks);
 
        // Cipher对象实际完成加密操作
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
 
        // 用密匙初始化Cipher对象
        cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
 
        // 现在,获取数据并加密
        // 正式执行加密操作
        return cipher.doFinal(src);
 
    }
 
    /**
     * 解密
     * @param src 数据源
     * @param key 密钥,长度必须是8的倍数
     * @return 返回解密后的原始数据
     * @throws Exception
     */
    public static byte[] decrypt(byte[] src, byte[] key) throws Exception {
 
        // DES算法要求有一个可信任的随机数源
        SecureRandom sr = new SecureRandom();
        // 从原始密匙数据创建一个DESKeySpec对象
        DESKeySpec dks = new DESKeySpec(key);
 
        // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
        // 一个SecretKey对象
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
 
        SecretKey securekey = keyFactory.generateSecret(dks);
 
        // Cipher对象实际完成解密操作
        Cipher cipher = Cipher.getInstance(DES);
 
        // 用密匙初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
 
        // 现在,获取数据并解密
        // 正式执行解密操作
        return cipher.doFinal(src);
 
    }
 
    /**
     * 密码解密
     * @param data
     * @return
     * @throws Exception
     */
    public final static String decrypt(String data) {
 
        try {
            String result = new String(decrypt(hex2byte(data.getBytes()), PASSWORD_CRYPT_KEY.getBytes()));
            System.out.println(result);
            return result;
        } catch (Exception e) {
            System.out.println(e);
            return data;
        }
//        return null;
    }
 
    /**
     * 密码加密
     * @param password
     * @return
     * @throws Exception
     */
    public final static String encrypt(String password) {
        try {
            return byte2hex(encrypt(password.getBytes(), PASSWORD_CRYPT_KEY.getBytes()));
        } catch (Exception e) {
 
        }
        return null;
    }
 
    /**
     * 二行制转字符串
     * @param b
     * @return
     */
    public static String byte2hex(byte[] b) {
 
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = (Integer.toHexString(b[n] & 0XFF));
            if (stmp.length() == 1)
                hs = hs + "0" + stmp;
            else
                hs = hs + stmp;
        }
        return hs.toUpperCase();
    }
 
    public static byte[] hex2byte(byte[] b) {
 
        if ((b.length % 2) != 0)
            throw new IllegalArgumentException("长度不是偶数");
        byte[] b2 = new byte[b.length / 2];
        for (int n = 0; n < b.length; n += 2) {
            String item = new String(b, n, 2);
            b2[n / 2] = (byte) Integer.parseInt(item, 16);
        }
        return b2;
    }

php代码如下(加密可与java互通)

<?php

/**
 * DES加密类
*
* 本类用于实现des算法的加密及解密
*
* 调用方法
* 加密为hex格式:DES::encryptDesEcbPkcs5('待加密原文', '密钥',DES::DATA_FORMAT_HEX)
* 解密hex格式的:数据 DES::decryptDesEcbPkcs5('密文hex', '密钥',DES::DATA_FORMAT_HEX)
* 加密为base64格式:DES::encryptDesEcbPkcs5('待加密原文', '密钥',DES::DATA_FORMAT_BASE64)
* 解密base64格式的数据:DES::decryptDesEcbPkcs5('密文base64', '密钥',DES::DATA_FORMAT_BASE64)
*/
class DES {
	
	const PADDING_MODE_NO = 0;
	const PADDING_MODE_PKCS5 = 1;
	const PADDING_MODE_PKCS7 = 2;
	
	const DATA_FORMAT_BIN = 0;//加密后的二进制数据
	const DATA_FORMAT_HEX = 1;//将加密后的二进制数据转为hex
	const DATA_FORMAT_BASE64 = 2;//将加密后的二进制数据转为base64
	
	/**
	 * 加密函数
	 * 算法:des
	 * 加密模式:ecb
	 * 补齐方法:PKCS5
	 * @param string $input 待加密字符串
	 * @param string $key 密钥
	 * @param int $binFormat 返回加密二进制数据的格式,可返回二进制原数据、hex、base64格式
	 */ 
	public static  function encryptDesEcbPkcs5($input,$key,$dataFormat=self::DATA_FORMAT_HEX)
	{
		$size = mcrypt_get_block_size(MCRYPT_DES,'ecb');
		$input = self::pkcs5_pad($input, $size);
		$td = mcrypt_module_open('des', '', 'ecb', '');
	
		$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
			
		@mcrypt_generic_init($td, $key, $iv);
		$data = mcrypt_generic($td, $input);
		mcrypt_generic_deinit($td);
		mcrypt_module_close($td);
		if ($dataFormat == self::DATA_FORMAT_HEX) {
			$data = strtoupper(bin2hex($data));
		}
		else if ($dataFormat == self::DATA_FORMAT_BASE64) {
			$data = base64_encode($data);
		}
		
		return $data;
	}
	/**
	 * 解密函数
	 * 算法:des
	 * 加密模式:ecb
	 * 补齐方法:PKCS5
	 * @param string $input 待加密字符串
	 * @param string $key 密钥
	 * @param int $binFormat 加密数据的格式,可为二进制数据、hex、base64格式
	 */
	public static  function decryptDESEcbPkcs5($input,$key,$dataFormat=self::DATA_FORMAT_HEX)
	{
		if ($dataFormat == self::DATA_FORMAT_HEX) {
			$input = hex2bin($input);
		}
		else if ($dataFormat == self::DATA_FORMAT_BASE64) {
			$input = base64_decode($input);
		}
		$size = mcrypt_get_block_size(MCRYPT_DES,'ecb');
		$td = mcrypt_module_open(MCRYPT_DES, '', 'ecb', '');
		$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
		@mcrypt_generic_init($td, $key, $iv);
		$data = mdecrypt_generic($td, $input);
		mcrypt_generic_deinit($td);
		mcrypt_module_close($td);
		$data = self::pkcs5_unpad($data, $size);
		return $data;
	}
	
	function pkcs5_pad($text, $blocksize) {
		$pad = $blocksize - (strlen ( $text ) % $blocksize);
		return $text . str_repeat ( chr ( $pad ), $pad );
	}
	
	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 );
	}
}

?>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值