php des加密 java_JAVA的DES加密类,怎么用PHP实现加密,解密

1、JAVA的DES加密类,怎么用PHP实现加密,解密。

(1)加密的情况

如果是密钥是123#Abcd,明文是hello world,输出3d518daea941120d72fe3488f5d27a64

在本代码下是会出现data解密前是87897DDA5754EAAE69E7F063E8B0962A,明文是{"retcode":"2"}

代码如下

//

// Source code recreated from a .class file by IntelliJ IDEA

// (powered by Fernflower decompiler)

//

package com.cxlm.commonutil;

import javax.crypto.Cipher;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

public class DESUTIL {

private final String ALGORITHM = "DES/ECB/NoPadding";

private final String KFNAME = "DES";

private final DESUTIL.Triplet[] tripletGroup = new DESUTIL.Triplet[]{new DESUTIL.Triplet("3939393939393939", "3132333435363738", (DESUTIL.Triplet)null)};

public DESUTIL() {

}

private String toPinBlock(String s) throws Exception {

StringBuffer sb = new StringBuffer();

int length = s.length();

if(length > 16) {

throw new Exception("");

} else {

if(length < 10) {

sb.append("0").append(Integer.toString(length)).append(s);

} else {

sb.append(Integer.toString(length)).append(s);

}

for(int i = sb.toString().length(); i < 16; ++i) {

sb.append("F");

}

return sb.toString();

}

}

private String toHex(String buffer) {

StringBuffer sb = new StringBuffer(buffer.length() / 2);

for(int i = 0; i < buffer.length(); i += 2) {

sb.append((char)Integer.parseInt(buffer.substring(i, i + 2), 16));

}

return sb.toString();

}

private String toHex(byte[] buffer) {

StringBuffer sb = new StringBuffer(2 * buffer.length);

byte[] var6 = buffer;

int var5 = buffer.length;

for(int var4 = 0; var4 < var5; ++var4) {

byte b = var6[var4];

sb.append(((b & 240) == 0?"0":"") + Integer.toHexString(b & 255));

}

return sb.toString();

}

private byte[] fromHex(String s) {

byte[] result = new byte[s.length() / 2];

int i = 0;

for(int j = 0; i < result.length; j += 2) {

result[i] = (byte)Integer.parseInt(s.substring(j, j + 2), 16);

++i;

}

return result;

}

private byte[] Xor(byte[] block1, byte[] block2) {

byte[] res = new byte[block1.length];

if(block1.length == block2.length) {

for(int i = 0; i < block1.length; ++i) {

res[i] = (byte)(block1[i] ^ block2[i]);

}

}

return res;

}

private byte[] DesGenerate_ENCRYPT(String key, String plaintext) throws Exception {

DESUTIL.Triplet triplet = new DESUTIL.Triplet(key, plaintext, (DESUTIL.Triplet)null);

Cipher des = Cipher.getInstance("DES/ECB/NoPadding");

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

byte[] ciphertext = (byte[])null;

des.init(1, keyFactory.generateSecret(new DESKeySpec(triplet.key)));

ciphertext = des.doFinal(triplet.plaintext);

return ciphertext;

}

private String DesStringGenerate_ENCRYPT(String key, String plaintext) throws Exception {

DESUTIL.Triplet triplet = new DESUTIL.Triplet(key, plaintext, (DESUTIL.Triplet)null);

Cipher des = Cipher.getInstance("DES/ECB/NoPadding");

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

byte[] ciphertext = (byte[])null;

des.init(1, keyFactory.generateSecret(new DESKeySpec(triplet.key)));

ciphertext = des.doFinal(triplet.plaintext);

return this.toHex(ciphertext).toUpperCase();

}

private String getData(String version) {

StringBuffer data = new StringBuffer(version.replace(".", ""));

char[] numbersAndLetters = "0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();

int length = version.split("\\.").length + 2;

int length2 = version.split("\\.").length + 5;

for(int i = 0; i < length; ++i) {

data.append(numbersAndLetters[length2 + i]);

}

return data.toString();

}

private byte[] DesGenerate_DECRYPT(String key, String plaintext) throws Exception {

DESUTIL.Triplet triplet = new DESUTIL.Triplet(key, plaintext, (DESUTIL.Triplet)null);

Cipher des = Cipher.getInstance("DES/ECB/NoPadding");

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

byte[] ciphertext = (byte[])null;

des.init(2, keyFactory.generateSecret(new DESKeySpec(triplet.key)));

ciphertext = des.doFinal(triplet.plaintext);

return ciphertext;

}

private String DesStringGenerate__DECRYPT(String key, String plaintext) throws Exception {

DESUTIL.Triplet triplet = new DESUTIL.Triplet(key, plaintext, (DESUTIL.Triplet)null);

Cipher des = Cipher.getInstance("DES/ECB/NoPadding");

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

byte[] ciphertext = (byte[])null;

des.init(2, keyFactory.generateSecret(new DESKeySpec(triplet.key)));

ciphertext = des.doFinal(triplet.plaintext);

return this.toHex(ciphertext).toUpperCase();

}

private void arraycopy(byte[] src, int srcPos, byte[] dest, int destPos, int length) {

if(dest != null && src != null) {

byte[] temp = new byte[length];

int i;

for(i = 0; i < length; ++i) {

temp[i] = src[srcPos + i];

}

for(i = 0; i < length; ++i) {

dest[destPos + i] = temp[i];

}

}

}

private byte[] ByteDataFormat(byte[] data) {

int len = data.length;

int padlen = 8 - len % 8;

int newlen = len + padlen;

byte[] newdata = new byte[newlen];

this.arraycopy(data, 0, newdata, 0, len);

for(int i = len; i < newlen; ++i) {

newdata[i] = 0;

}

return newdata;

}

private byte[] getKey(byte[] data) {

int len = data.length;

byte[] newdata = new byte[8];

if(len >= 8) {

this.arraycopy(data, 0, newdata, 0, 8);

} else {

data = this.ByteDataFormat(data);

this.arraycopy(data, 0, newdata, 0, 8);

}

return newdata;

}

public String encrypt(String key, String plaintext) {

String r = "";

try {

if(plaintext == null || plaintext.equals("")) {

return "";

}

r = this.DesStringGenerate_ENCRYPT(this.toHex(this.getKey(key.getBytes())), this.toHex(this.ByteDataFormat(plaintext.getBytes("UTF-8"))));

} catch (Exception var5) {

;

}

return r;

}

public String decrypt(String key, String cryptograph) {

String r = "";

try {

if(cryptograph == null || cryptograph.equals("")) {

return "";

}

String text = this.DesStringGenerate__DECRYPT(this.toHex(this.getKey(key.getBytes())), cryptograph);

String text2 = "";

int index = text.indexOf("00");

if(index == -1) {

text2 = text;

} else if(index % 2 == 1) {

text2 = text.substring(0, index + 1);

} else {

text2 = text.substring(0, index);

}

r = new String(this.fromHex(text2), "UTF-8");

} catch (Exception var7) {

;

}

return r;

}

private class Triplet {

private final byte[] key;

private final byte[] plaintext;

private Triplet(String key, String plaintext) {

this.key = DESUTIL.this.fromHex(key);

this.plaintext = DESUTIL.this.fromHex(plaintext);

}

}

}

(2)解决方案1,利用以下方法(失败)

输出1bb0a435b0fcbfe2c48d896fa67b4e53

代码如下

/**

* 使用DES对数据进行解密

* @param string $data 要加密的数据

* @param string $key 加密数据时候使用的密钥(64bit-->8byte密钥; 128bit-->16byte密钥; 256bit-->32byte密钥)

* @param string $iv 加密向量数据, 默认为: 0123456789123456

* @return string 已解密的数据

*/

function des_encrypt($data, $key, $iv='', $padding="\0") {

$blocksize = 16;

$pad = $blocksize - (strlen($data) % $blocksize); //计算填充长度

$data = $data . str_repeat($padding, $pad); //使用\0进行填充

return bin2hex(mcrypt_encrypt(MCRYPT_DES, $key, $data, MCRYPT_MODE_ECB, $iv));

}

/**

* 使用DES对数据进行解密

* @param string $data 要解密的数据

* @param string $key 加密数据时候使用的密钥(64bit-->8byte密钥; 128bit-->16byte密钥; 256bit-->32byte密钥)

* @param string $iv 加密向量数据, 默认为: 0123456789123456

* @return string 已解密的数据

*/

function des_decrypt($data, $key, $iv='', $padding="\0") {

//先进行解密, 最后对解密的数据进行填充去除

return rtrim(mcrypt_decrypt(MCRYPT_DES, $key, hex2bin($data), MCRYPT_MODE_ECB, $iv), $padding);

}

echo des_encrypt('hello world', '123#Abcd').'';

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值