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').'</br>';
阅读 2.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题