Java用Des方式加密之后,PHP怎么解密

Python017

Java用Des方式加密之后,PHP怎么解密,第1张

DES是一种标准的数据加密算法,关于这个算法的详细介绍可以参考wiki和百度百科:

php中有一个扩展可以支持DES的加密算法,是:extension=php_mcrypt.dll

在配置文件中将这个扩展打开还不能够在windows环境下使用

需要将PHP文件夹下的 libmcrypt.dll 拷贝到系统的 system32 目录下,这是通过phpinfo可以查看到mcrypt表示这个模块可以正常试用了。

下面是PHP中使用DES加密解密的一个例子:

//$input - stuff to decrypt

//$key - the secret key to use

function do_mencrypt($input, $key)

{

$input = str_replace(""n", "", $input)

$input = str_replace(""t", "", $input)

$input = str_replace(""r", "", $input)

$key = substr(md5($key), 0, 24)

$td = mcrypt_module_open('tripledes', '', 'ecb', '')

$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND)

mcrypt_generic_init($td, $key, $iv)

$encrypted_data = mcrypt_generic($td, $input)

mcrypt_generic_deinit($td)

mcrypt_module_close($td)

return trim(chop(base64_encode($encrypted_data)))

}

//$input - stuff to decrypt

//$key - the secret key to use

function do_mdecrypt($input, $key)

{

$input = str_replace(""n", "", $input)

$input = str_replace(""t", "", $input)

$input = str_replace(""r", "", $input)

$input = trim(chop(base64_decode($input)))

$td = mcrypt_module_open('tripledes', '', 'ecb', '')

$key = substr(md5($key), 0, 24)

$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND)

mcrypt_generic_init($td, $key, $iv)

$decrypted_data = mdecrypt_generic($td, $input)

mcrypt_generic_deinit($td)

mcrypt_module_close($td)

return trim(chop($decrypted_data))

}

例直接拿用

package com.nnff.des

import java.security.Security

import javax.crypto.Cipher

import javax.crypto.SecretKey

import javax.crypto.spec.SecretKeySpec

/*字符串 DESede(3DES) 加密

* ECB模式/使用PKCS7式填充足位,目前给密钥192位

* 3DES(即Triple DES)DES向AES渡加密算(1999NIST3-DES指定渡

* 加密标准)DES更安全变形DES基本模块通组合组设计组加

* 密算其具体实现:设Ek()Dk()代表DES算加密解密程K代表DES算使用

* 密钥P代表明文C代表密表

* 3DES加密程:C=Ek3(Dk2(Ek1(P)))

* 3DES解密程:P=Dk1((EK2(Dk3(C)))

* */

public class ThreeDes {

/**

* @param argsjava调用sun公司提供3DES加密解密算需要使

* 用$JAVA_HOME/jre/lib/目录4jar包:

*jce.jar

*security/US_export_policy.jar

*security/local_policy.jar

*ext/sunjce_provider.jar

*/

private static final String Algorithm = "DESede"//定义加密算,用 DES,DESede,Blowfish

//keybyte加密密钥度24字节

//src加密数据缓冲区(源)

public static byte[] encryptMode(byte[] keybyte,byte[] src){

try {

//密钥

SecretKey deskey = new SecretKeySpec(keybyte, Algorithm)

//加密

Cipher c1 = Cipher.getInstance(Algorithm)

c1.init(Cipher.ENCRYPT_MODE, deskey)

return c1.doFinal(src)//单面加密或解密

} catch (java.security.NoSuchAlgorithmException e1) {

// TODO: handle exception

e1.printStackTrace()

}catch(javax.crypto.NoSuchPaddingException e2){

e2.printStackTrace()

}catch(java.lang.Exception e3){

e3.printStackTrace()

}

return null

}

//keybyte加密密钥度24字节

//src加密缓冲区

public static byte[] decryptMode(byte[] keybyte,byte[] src){

try {

//密钥

SecretKey deskey = new SecretKeySpec(keybyte, Algorithm)

//解密

Cipher c1 = Cipher.getInstance(Algorithm)

c1.init(Cipher.DECRYPT_MODE, deskey)

return c1.doFinal(src)

} catch (java.security.NoSuchAlgorithmException e1) {

// TODO: handle exception

e1.printStackTrace()

}catch(javax.crypto.NoSuchPaddingException e2){

e2.printStackTrace()

}catch(java.lang.Exception e3){

e3.printStackTrace()

}

return null

}

//转换十六进制字符串

public static String byte2Hex(byte[] b){

String hs=""

String stmp=""

for(int n=0n<b.lengthn++){

stmp = (java.lang.Integer.toHexString(b[n]&0XFF))

if(stmp.length()==1){

hs = hs + "0" + stmp

}else{

hs = hs + stmp

}

if(n<b.length-1)hs=hs+":"

}

return hs.toUpperCase()

}

public static void main(String[] args) {

// TODO Auto-generated method stub

//添加新安全算,用JCE要添加进

Security.addProvider(new com.sun.crypto.provider.SunJCE())

final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58,

(byte)0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51,

(byte)0xCB,

(byte)0xDD, 0x55, 0x66, 0x77, 0x29, 0x74,

(byte)0x98, 0x30, 0x40, 0x36,

(byte)0xE2

}//24字节密钥

String szSrc = "This is a 3DES test. 测试"

System.out.println("加密前字符串:" + szSrc)

byte[] encoded = encryptMode(keyBytes,szSrc.getBytes())

System.out.println("加密字符串:" + new String(encoded))

byte[] srcBytes = decryptMode(keyBytes,encoded)

System.out.println("解密字符串:" + (new String(srcBytes)))

}

}

-