java中的 DES 加密与解密

DES类

package dao;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class DES {

public static String ALGORITHM_DES="DES";       //加密算法的名称 
public static KeyGenerator keygen;          //密钥生成器 
public static SecretKey secretKey;      //密钥 
public static Cipher cipher;        //密码器
public byte[] bytes;

static{
    Security.addProvider(new com.sun.crypto.provider.SunJCE());
    try{
        keygen=KeyGenerator.getInstance(ALGORITHM_DES);
        secretKey=keygen.generateKey();
        cipher=Cipher.getInstance(ALGORITHM_DES);
    }catch(Exception e){
        e.printStackTrace();
    }
}

//加密
public byte[] encryptor(String str){
    try {
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);    //初始化密码器,用密钥 secretKey 进入加密模式
        bytes=cipher.doFinal(str.getBytes());   //加密
    } catch (Exception e) {
        e.printStackTrace();
    }

    return bytes;
}

//解密
public String decryptor(byte[] buff){
    try {
        cipher.init(Cipher.DECRYPT_MODE, secretKey);    //初始化密码器,用密钥 secretKey 进入解密模式
        bytes=cipher.doFinal(buff);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return (new String(bytes));
}

}

index.jsp

index.jsp

%>

我的问题:在 index.jsp 页面里提交的超链接 Demo 提交到 Action ,但是一点击,后台就报错:
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
at dao.DES.decryptor(DES.java:44)
at filter.MyFilter.doFilter(MyFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
java.lang.NullPointerException
at java.lang.String.(Unknown Source)
at dao.DES.decryptor(DES.java:48)
at filter.MyFilter.doFilter(MyFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
解密前:product_id=[B@3242ef

是哪里写的不对,请高手指点,我的目的是从 index.jsp 把值(product_id)进行加密,在 Action 里面取出 加密后的字符串,进行解密,但解密那一块有问题,可能是 DES 类写的有问题,请高手帮忙在原有的代码基础上修改。成分感激!!

9个回答

久等了

 *
 * author: hyb1996 (CSDN)
 * 说明:密匙key的长度必须是8的倍数
 */

package encryption;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.crypto.*;
import javax.crypto.spec.*;

public class DES {

    // 默认密匙
    private static String key = "19491001";
    // 缓冲区大小
    private static final int BufferSize = 1024 * 1024 * 10;

    // 加密解密测试测试
    public static void test() {
        String text = "111测试asdY^&*NN!__s some plaintext!";
        System.out.println("加密前的明文:" + text);

        String cryperText = "";
        try {
            cryperText = toHexString(encrypt(text));
            System.out.println("加密后的明文:" + cryperText);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            System.out.println("解密后的明文:"
                    + new String(decrypt(convertHexString(cryperText), key),
                            "UTF-8"));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            System.in.read();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    // 设置默认密匙
    public static void setKey(String k) {
        key = k;
    }

    // 用指定密匙对密文message解密并返回解密后byte[]
    public static byte[] decrypt(String message, String key) throws Exception {
        return decrypt(message.getBytes("UTF-8"), key);
    }

    // 用默认密匙对密文message解密并返回解密后byte[]
    public static byte[] decrypt(String message) throws Exception {
        return decrypt(message, key);
    }

    // 用指定密匙对密文数据data解密并返回解密后byte[]
    public static byte[] decrypt(byte[] data, String key) throws Exception {
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        return cipher.doFinal(data);
    }

    // 用指定密匙对密文data从offset开始长度为len的数据解密并返回解密后byte[]
    public static byte[] decrypt(byte[] data, int offset, int len, String key)
            throws Exception {
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        return cipher.doFinal(data, offset, len);
    }

    // 用指定密匙对字符串message加密并返回加密后byte[]
    public static byte[] encrypt(String message, String key) throws Exception {
        return encrypt(message.getBytes("UTF-8"), key);
    }

    // 用默认密匙对字符串message加密并返回加密后byte[]
    public static byte[] encrypt(String message) throws Exception {
        return encrypt(message, key);
    }

    // 用指定密匙对数据data加密并返回加密后byte[]
    public static byte[] encrypt(byte[] data, String key) throws Exception {
        return encrypt(data, 0, data.length, key);
    }

    // 用指定密匙对密文data从offset开始长度为len的数据加密并返回加密后byte[]
    public static byte[] encrypt(byte[] data, int offset, int len, String key)
            throws Exception {
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        return cipher.doFinal(data, offset, len);
    }


    public static byte[] convertHexString(String ss) {
        byte digest[] = new byte[ss.length() / 2];
        for (int i = 0; i < digest.length; i++) {
            String byteString = ss.substring(2 * i, 2 * i + 2);
            int byteValue = Integer.parseInt(byteString, 16);
            digest[i] = (byte) byteValue;
        }

        return digest;
    }

    public static String toHexString(byte b[]) {
        StringBuffer hexString = new StringBuffer();
        for (int i = 0; i < b.length; i++) {
            String plainText = Integer.toHexString(0xff & b[i]);
            if (plainText.length() < 2)
                plainText = "0" + plainText;
            hexString.append(plainText);
        }

        return hexString.toString();
    }

    //用指定密匙key对路径为path的文件加密并写入路径为out的文件中 
    public static void fileEncrypt(String path, String out, String key)
            throws Exception {
        File file = new File(path);
        FileInputStream in = new FileInputStream(file);
        file = new File(out);
        if (file.exists())
            file.delete();
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        byte[] buffer = new byte[BufferSize];
        byte[] outbuf;
        int size = in.available();
        int done = 0;
        while (in.available() > 0) {
            int len = in.read(buffer);
            outbuf = DES.encrypt(buffer, 0, len, key);
            fos.write(outbuf, 0, outbuf.length);
            done += len;
            System.out.print(100 * (long) done / size);
            System.out.println('%');

        }
        fos.close();
        in.close();
    }

    //用指定密匙key对路径为path的文件加密并写入路径为out的文件中,而且不使用缓冲区
    public static void $fileEncrypt(String path, String out, String key)
            throws Exception {
        File file = new File(path);
        FileInputStream in = new FileInputStream(file);
        file = new File(out);
        if (file.exists())
            file.delete();
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        byte[] buffer = new byte[in.available()];
        in.read(buffer);
        buffer = DES.encrypt(buffer, key);
        fos.write(buffer, 0, buffer.length);
        fos.close();
        in.close();
    }

    //用指定密匙key将字符串message加密并写入路劲为out的文件中
    public static void StringEncryptIntoFile(String message, String out,
            String key) throws Exception {
        File file = new File(out);
        if (file.exists())
            file.delete();
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        byte[] data = encrypt(message, key);
        fos.write(data);
        fos.close();
    }

    //用指定密匙key对路径为path的密文文件解密并写入路径为out的文件中 
    public static void fileDecrypt(String path, String out, String key)
            throws Exception {
        File file = new File(path);
        FileInputStream in = new FileInputStream(file);
        file = new File(out);
        if (file.exists())
            file.delete();
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        byte[] buffer = new byte[BufferSize + 8];
        byte[] outbuf;
        int size = in.available();
        int done = 0;
        while (in.available() > 0) {
            int len = in.read(buffer);
            outbuf = DES.decrypt(buffer, 0, len, key);
            fos.write(outbuf, 0, outbuf.length);
            done += len;
            System.out.print(100 * (long) done / size);
            System.out.println('%');
        }
        fos.close();
        in.close();
    }

    //用指定密匙key对路径为path的密文文件解密并写入路径为out的文件中 ,且不使用缓冲区
    public static void $fileDecrypt(String path, String out, String key)
            throws Exception {
        File file = new File(path);
        FileInputStream in = new FileInputStream(file);
        file = new File(out);
        if (file.exists())
            file.delete();
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        byte[] buffer = new byte[in.available()];
        in.read(buffer);
        buffer = DES.decrypt(buffer, key);
        fos.write(buffer, 0, buffer.length);
        fos.close();
        in.close();
    }

    //用指定密匙key对路径为path的密文文件解密得到明文字符串并返回
    public static String fileDecrypt(String path, String key) throws Exception {
        File file = new File(path);
        FileInputStream in = new FileInputStream(file);
        byte[] buffer = new byte[BufferSize + 8];
        StringBuffer sb = new StringBuffer();
        int size = in.available();
        int done = 0;
        byte[] outbuf;
        while (in.available() > 0) {
            int len = in.read(buffer);
            outbuf = DES.decrypt(buffer, 0, len, key);
            sb.append(new String(outbuf, 0, outbuf.length, "UTF-8"));
            done += len;
            System.out.print(100 * (long) done / size);
            System.out.println('%');
        }
        in.close();
        return sb.toString();
    }

由于部分源代码CSDN网站没有完全显示,这里把 index.jsp 完整代码拍照片

ycn5202005
ycn5202005 这是 index.jsp 页面的完整源代码。(CSDN老是把提交的代码给屏蔽掉一些,不知道是怎么回事!)
4 年多之前 回复

我之前做个类似项目,自己有写一个DES加密解密的类,等我吃饱把代码贴给你。

hyb1996
hyb1996 半个小时~
4 年多之前 回复
ycn5202005
ycn5202005 那非常感谢,等待中........
4 年多之前 回复

CSDN是怎么回事?发布的全部代码,还有部分没有显示,真头疼,这让回答的朋友看不全呀。

说明一下,可以这样使用:
byte[] miwen = DES.encrypt("1",key);
String mingwen = new String(DES.decrypt(miwen,key));
System.out.println(mingwen);


ycn5202005
ycn5202005 研究明白了,非常感谢!
4 年多之前 回复
                index.jsp文件:
                String test="100";
                System.out.println("加密:"+DES3.encrypt(test,"20160223"));
                System.out.println("解密:"+new String(DES3.decrypt(DES3.encrypt(test,"20160223"),"20160223")));
                通过一个超链接:<a href="productAction-query?product_id=<%=DES3.encrypt(test,"20160223") %>">Demo</a>

                Action 文件:
                String product_id=request.getParameter("product_id");
                System.out.println("解密前:product_id="+product_id);
                System.out.println("解密后:product_id="+new String(DES3.decrypt(product_id,"20160223")));

                提交之后后台报错:
                加密:[B@44c5d3

解密:100

解密前:product_id=[B@117b032
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
at dao.DES3.decrypt(DES3.java:67)

hyb1996,再帮忙看一下呗,非常感谢!
我个人感觉:System.out.println("解密后:product_id="+new String(DES3.decrypt(product_id,"20160223")));这行有问题,因为 product_id 在index.jsp里面是byte[]类型了,而在 Action类里面 request.getParameter 都是字符串String类型了,应该怎么解决这个问题呢?

已经搞明白了,DES3.toHexString(DES3.encrypt(test,"20160223"),这样发送才行。
另外一个问题想请教一下:你的这个定义 private static String key = "19491001"; 是加密时用的吧?那 我的这个:DES3.encrypt(test,"20160223") 这里面的"20160223"是不是就不需要了?如果我自己定义个8位数的字符串key,就改一下你那里面的 key 初始值就行了吧?

ycn5202005
ycn5202005 回复hyb1996: ok,明白了,非常感谢您的帮助。
4 年多之前 回复
hyb1996
hyb1996 这个19491001是默认密匙(加密或解密都需要密匙),可以修改初始值或者通过setKey函数修改,而你传入的参数20160223是忽略默认密匙重新指定密匙为20160223,如果不指定,将会使用默认密匙进行加密解密。
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
求JAVAdes加密解密和DES算法工具加密解密结果一样的

![图片说明](https://img-ask.csdn.net/upload/201505/29/1432864544_153868.png)如图,在网上找了很多方法,不是结果不一样就是解出来的是乱码

(C#转JAVA)DES加密解密问题 。带入整8B加密数据, JAVA写的总是比C#写的多出来8B

C# private byte[] CSharpEncryptByte(byte[] InputByte, byte[] sKey) { DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); DES.Padding = PaddingMode.Zeros; DES.Key = sKey; DES.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }; ICryptoTransform desencrypt = DES.CreateEncryptor(); byte[] result = desencrypt.TransformFinalBlock(InputByte, 0, InputByte.Length); return result; } JAVA public static byte[] JavaEncryptByte(byte[] InputByte, byte[] bKey) throws Exception { byte[] ivdata = new byte[]{0, 0, 0, 0, 0, 0, 0, 0}; IvParameterSpec spec = new IvParameterSpec(ivdata); SecretKeySpec keySpec = new SecretKeySpec(bKey, "DES"); Cipher cipherex = Cipher.getInstance("DES/CBC/ZeroBytePadding"); cipherex.init(Cipher.ENCRYPT_MODE, keySpec, spec); byte[] encdata = cipherex.doFinal(InputByte, 0, InputByte.length); return encdata; }

java 3DES 解密时部分乱码

3DES 解密时,出现部分乱码,byte数组里有负值,不知道如何解决 ,求大神指导,代码如下: ``` import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; /*字符串 DESede(3DES) 加密 * ECB模式/使用PKCS7方式填充不足位,目前给的密钥是192位 * 3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的 * 加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加 * 密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的 * 密钥,P代表明文,C代表密表,这样, * 3DES加密过程为:C=Ek3(Dk2(Ek1(P))) * 3DES解密过程为:P=Dk1((EK2(Dk3(C))) * */ public class url { private static final String Algorithm = "DESede/CBC/NoPadding"; //定义加密算法,可用 DES,DESede,Blowfish private static final String key="CCBJF2014cowell20151118Y"; private static final String vi = "KW2015rj"; //keybyte为加密密钥,长度为24字节 //src为加密后的缓冲区 public static String decryptMode(String strMi){ try { //szSrc.getBytes("UTF-8"); byte[] src = com.sun.org.apache.xml.internal.security.utils.Base64.decode(strMi); //src = it.sauronsoftware.base64.Base64.encode(src); DESedeKeySpec dks = new DESedeKeySpec(key.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey securekey = keyFactory.generateSecret(dks); IvParameterSpec iv = new IvParameterSpec(vi.getBytes()); Cipher cipher = Cipher.getInstance(Algorithm); cipher.init(Cipher.DECRYPT_MODE, securekey,iv ); byte[] encoded = cipher.doFinal(src);//在单一方面的加密或解密 //Base64.encode(encoded); return new String(encoded); } 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 void main(String[] args) throws UnsupportedEncodingException { // TODO Auto-generated method stub //添加新安全算法,如果用JCE就要把它添加进去 String szSrc = "G6ZT+GxPq7JkGuLjVQ4TUAUyTcp+UnNpsoKGzy5FudtRNn6v9tSyWmxpcnFu01Rk8Th0NoV0E8TIhffliYQ4xQicG8ciVYWP2s+jk192tJrF6x6WV0ej2w=="; szSrc.getBytes("UTF-8"); System.out.println("jie密前的字符串:" + szSrc); System.out.println("jie密后的字符串:" + decryptMode(szSrc)); //byte[] srcBytes = decryptMode(keyBytes,encoded); //System.out.println("解密后的字符串:" + (new String(srcBytes))); } } ```

为什么在Java中执行DES加密的结果与在PHP中执行的结果不同?

<div class="post-text" itemprop="text"> <p>I ran the Trible DES Encryption in Java, with <code>null</code> IV (I have run <code>cipher.getIV()</code> method and indeed it's IV is null) and the same string ran the Triple DES Encryption in PHP with <code>null</code> IV, but I get a different result. Why is that?</p> <p>Java Code:</p> <pre><code>private static final String model = "DESede/ECB/PKCS5Padding"; public static String desEncrypt(String message, String key) throws Exception { byte[] keyBytes = null; if(key.length() == 16){ keyBytes = newInstance8Key(ByteUtil.convertHexString(key)); } else if(key.length() == 32){ keyBytes = newInstance16Key(ByteUtil.convertHexString(key)); } else if(key.length() == 48){ keyBytes = newInstance24Key(ByteUtil.convertHexString(key)); } SecretKey deskey = new SecretKeySpec(keyBytes, "DESede"); Cipher cipher = Cipher.getInstance(model); cipher.init(1, deskey); return ByteUtil.toHexString(cipher.doFinal(message.getBytes("UTF-8"))); } </code></pre> <p>PHP Code:</p> <pre><code>// composer require phpseclib/phpseclib use phpseclib\Crypt\TripleDES; function desEncrypt($str,$key){ $cipher = new TripleDES(); $cipher-&gt;setKey(hex2bin($key)); $cryptText = $cipher-&gt;encrypt($str); return unpack("H*",$cryptText)[1]; } </code></pre> <p>I want to modify my PHP code to fit the Java Encryption Process,how should I do? where is the proplem?</p> <p>Java Encrypt Result:</p> <pre><code>before: 622700300000 key: 0123456789ABCDEFFEDCBA98765432100123456789ABCDEF after: c9aa8ebfcc12ce13e22a33b05d4c18cf </code></pre> <p>PHP Encrypt Result:</p> <pre><code>before: 622700300000 key: 0123456789ABCDEFFEDCBA98765432100123456789ABCDEF after: a6e7a000d4ce79ac8b3db9f6acf73de3 </code></pre> <p>Fixed PHP Code:</p> <pre><code>/** * Triple DES (ECB) Encryption Function * PKCS5Padding * * @param string $message String needed to be encode * @param string $key Hex encoded key * @return string Hex Encoded */ function desEncrypt($message,$key){ $cipher = new TripleDES(TripleDES::MODE_ECB); $cipher-&gt;setKey(hex2bin($key)); $cryptText = $cipher-&gt;encrypt($message); return bin2hex($cryptText); } </code></pre> </div>

关于java解密的问题,C#DES加密过的数据,用java解密

C#加密解密代码如下 ``` public static String sKey = "xxxxxx"; /// <summary> /// 加密 /// </summary> /// <param name="Text"></param> /// <returns></returns> public static String Encrypt(String EncryptText) { return Encrypt(EncryptText, sKey); } /// <summary> /// 加密数据 /// </summary> /// <param name="Text"></param> /// <param name="sKey"></param> /// <returns></returns> public static String Encrypt(String Text, String sKey) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); // DESKeySpec k = new DESKeySpec(sKey.getBytes("UTF-8")); byte[] inputByteArray; inputByteArray = Encoding.Default.GetBytes(Text); des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); System.IO.MemoryStream ms = new System.IO.MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); foreach (byte b in ms.ToArray()) { ret.AppendFormat("{0:X2}", b); } return ret.ToString(); } /// <summary> /// 解密 /// </summary> /// <param name="Text"></param> /// <returns></returns> public static String Decrypt(String MD5Text) { return Decrypt(MD5Text, sKey); } /// <summary> /// 解密数据 /// </summary> /// <param name="Text"></param> /// <param name="sKey"></param> /// <returns></returns> public static String Decrypt(String Text, String sKey) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); int len; len = Text.Length / 2; byte[] inputByteArray = new byte[len]; int x, i; for (x = 0; x < len; x++) { i = Convert.ToInt32(Text.Substring(x * 2, 2), 16); inputByteArray[x] = (byte)i; } des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); System.IO.MemoryStream ms = new System.IO.MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); return Encoding.Default.GetString(ms.ToArray()); } ``` 我写的解密java代码如下 ``` private final byte[] DESkey = DigestUtils.md5Hex("xxxxxx").substring(0, 8).getBytes("UTF-8");// 设置密钥 private final byte[] DESIV = DigestUtils.md5Hex("xxxxxx").substring(0, 8).getBytes("UTF-8");// 设置向量 private AlgorithmParameterSpec iv = null;// 加密算法的参数接口,IvParameterSpec是它的一个实现 private Key key = null; public CryptoTools() throws Exception { DESKeySpec keySpec = new DESKeySpec(DESkey);// 设置密钥参数 iv = new IvParameterSpec(DESIV);// 设置向量 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 获得密钥工厂 key = keyFactory.generateSecret(keySpec);// 得到密钥对象 } public String decode(String data) throws Exception { Cipher deCipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); deCipher.init(Cipher.DECRYPT_MODE, key, iv); BASE64Decoder base64Decoder = new BASE64Decoder(); byte[] inputByteArray = base64Decoder.decodeBuffer(data); byte[] pasByte = deCipher.doFinal(inputByteArray); return new String(pasByte, "UTF-8"); } public static void main(String[] args) { try { String test = "0608E27EC1E8A308A84E87D1A6FBC3B0"; CryptoTools des = new CryptoTools();//自定义密钥 System.out.println("加密前的字符:"+test); System.out.println("解密后的字符:"+des.decode(test)); } catch (Exception e) { e.printStackTrace(); } } ``` 测试运行一直报错,求大神解答 ``` javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966) at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824) at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314) at javax.crypto.Cipher.doFinal(Cipher.java:2165) at com.walch.wx.util.md5.util.CryptoTools.decode(CryptoTools.java:59) at com.walch.wx.util.md5.util.CryptoTools.main(CryptoTools.java:69) ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [util.c:840] ```

【JAVA】如何判断输入字符是否DES加密过?

在对输入字符做DES解密时,是否可以先判断下是否加密?如何判断输入字符是否有DES加密?

有大神能给份des加解密的java代码没,最好是16进制密文的,找了不少都是base64的

有没有大神给份java的des加解密的代码,需要先把十进制明文密码转成16进制,补足16位之后再进行加密或解密操作,谢谢各位大神

C#加密 Java解密 不成功

最近遇到一个问题 C#DES加密 A加密一段URL,发给B,B用的是Java解密,而A用的是C#加密 本来也没有多大问题,可是两边没有商榷好 解密:Java利用已有password生成密钥key, ``` KeyGenerator keyGenerator = KeyGenerator.getInstance(DES); keyGenerator.init(new SecureRandom(key)); SecretKey securekey = keyGenerator.generateKey(); // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance(DES); // 用密钥初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey);//, sr ``` 然而,C#中使用的是取已有password的前8个字节, B已与其他测试完毕,但与A仍无法解密成功。 所以,我想问,在B不变的情况下,A如何在C#的环境下,实现利用已有password生成密钥。。。。

JAVA.C#关于3DES加密的代码转化

现在需要一份Java版的3DES加密。 但是对方给的是一份C#版本的。 求哪个大神帮忙转化一下。 或者告知C#代码的思路。 key是9762D45A7F5F49FDA284FB686A4F99B9 向量是01,02,03,04,05,06,07,08 ``` public static string EncryptSP(string toEncryptStr, string key, string iv) { string ErrorDesc = ""; if (toEncryptStr == "") return ""; try { if (key.Length < 24) { key = key.PadRight(24, '1'); } byte[] Encrypted, ivArray, keyArray; // 获取加密向量和CP密钥 ivArray = CryptographyUtility.HexStringToByteArray(iv); keyArray = Encoding.Default.GetBytes(key); if (EncryptSP(keyArray, ivArray, ConvertStringToByteArray(toEncryptStr), out Encrypted)) { return ByteArrayToHexString(Encrypted); } else return ""; } catch (Exception e) { ErrorDesc = e.Message; throw new Exception("CommonEncrypt(使用固定Key对字符串进行加密)-》" + ErrorDesc); } catch { ErrorDesc = CryptogramErrorDefinition.E_Cryptogram_SYSTEM_ERROR_DESC; throw new Exception("CommonEncrypt(使用固定Key对字符串进行加密)-》" + ErrorDesc); } } /// <summary> /// 将16进制字符串转换成byte数组 /// </summary> /// <param name="s"></param> /// <returns></returns> public static byte[] HexStringToByteArray(string s) { Byte[] buf = new byte[s.Length / 2]; for (int i = 0; i < buf.Length; i++) { buf[i] = (byte)(chr2hex(s.Substring(i * 2, 1)) * 0x10 + chr2hex(s.Substring(i * 2 + 1, 1))); } return buf; } /// <summary> /// 字符转换成16显示 /// </summary> /// <param name="chr"></param> /// <returns></returns> private static byte chr2hex(string chr) { switch (chr) { case "0": return 0x00; case "1": return 0x01; case "2": return 0x02; case "3": return 0x03; case "4": return 0x04; case "5": return 0x05; case "6": return 0x06; case "7": return 0x07; case "8": return 0x08; case "9": return 0x09; case "A": return 0x0a; case "B": return 0x0b; case "C": return 0x0c; case "D": return 0x0d; case "E": return 0x0e; case "F": return 0x0f; } return 0x00; } /// <summary> /// 加密(3DES) /// </summary> /// <param name="KEY">加密密钥</param> /// <param name="IV">加密向量</param> /// <param name="TobeEncrypted">加密字符串</param> /// <param name="Encrypted">加密后Byte数组</param> /// <returns></returns> public static bool EncryptSP(byte[] KEY, byte[] IV, byte[] TobeEncrypted, out byte[] Encrypted) { string ErrorDesc = ""; if (KEY == null || IV == null) throw new Exception("Encrypt(加密)-》" + ErrorDesc); Encrypted = null; try { byte[] tmpiv = { 0, 1, 2, 3, 4, 5, 6, 7 }; for (int ii = 0; ii < 8; ii++) { tmpiv[ii] = IV[ii]; } byte[] tmpkey = { 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7 }; for (int ii = 0; ii < 24; ii++) { tmpkey[ii] = KEY[ii]; } //tridesencrypt.Dispose(); des3.Mode = CipherMode.ECB; ICryptoTransform tridesencrypt = des3.CreateEncryptor(tmpkey, tmpiv); //tridesencrypt = des.CreateEncryptor(KEY,tmpiv); Encrypted = tridesencrypt.TransformFinalBlock(TobeEncrypted, 0, TobeEncrypted.Length); //tridesencrypt.Dispose(); des3.Clear(); return true; } catch (Exception e) { ErrorDesc = e.Message; throw new Exception("Encrypt(加密)-》" + ErrorDesc); } catch { ErrorDesc = CryptogramErrorDefinition.E_Cryptogram_SYSTEM_ERROR_DESC; throw new Exception("Encrypt(加密)-》" + ErrorDesc); } } public static byte[] ConvertStringToByteArray(String s) { return System.Text.Encoding.GetEncoding("utf-8").GetBytes(s);//gb2312 } public static string ByteArrayToHexString(byte[] buf) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < buf.Length; i++) { sb.Append(buf[i].ToString("X").Length == 2 ? buf[i].ToString("X") : "0" + buf[i].ToString("X")); } return sb.ToString(); } ```

在java中如何实现对数据进行3DES的ECB加密算法

要加密的数据为:`5140000000080401AEBFFFFFFFF7FBFE` 密钥为:`00000000000000000000000000000000` 最后的结果为:`DBBE8A87A4E37D95B5EDDD2BE6A4151`F 我的代码为: //SecretKey负责对称密钥的保存 private SecretKey desKey; //完成加密和解密工作 private Cipher c; //保存加密结果 private byte[] cipherResultByte; private final static String Algorithm = "DESede/ECB/NoPadding";//加密方法/运算模式 private static DESedeKeySpec dks; private static SecretKeyFactory keyFactory; public DESeseTest02() { Security.addProvider(new com.sun.crypto.provider.SunJCE()); try { dks = new DESedeKeySpec("00000000000000000000000000000000".getBytes()); keyFactory = SecretKeyFactory.getInstance("DESede"); //生成密钥 desKey=keyFactory.generateSecret(dks); //生成Cipher对象,指定其支持DES算法 c=Cipher.getInstance(Algorithm); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (InvalidKeySpecException e) { e.printStackTrace(); } } public byte[] createEncryptor(byte[] b){ try { // System.out.println(str); //根据密钥,对Cipher进行初使化,DECRYPT_MODE加密模式 c.init(Cipher.ENCRYPT_MODE, desKey); // byte[] input=str.getBytes(); // System.out.println(input.length); //加密,将结果保存 cipherResultByte=c.doFinal(b); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return cipherResultByte; } 可加密出来的数据不对,大家帮忙给看看是怎么回事?谢谢大家

Javascript DES加密/ PHP解密

<div class="post-text" itemprop="text"> <p>I have a PHP endpoint that is used by several websites. While POSTing data to the endpoint the sites use encrypted headers to identify various information. The sites use the standard PHP <code>mcrypt_ecb</code> function, and the endpoint decrypts the variables like this:</p> <pre><code>$var = trim(mcrypt_ecb(MCRYPT_DES, $key, base64_decode($input), MCRYPT_DECRYPT))); </code></pre> <p>I don't really have much chance of altering the PHP endpoint, although I could conceivably make another endpoint if <code>mcrypt_ecb</code> doesn't play nicely. </p> <p>I now have a PhoneGap app, which also needs to send the encrypted headers. Phonegap can only really use javascript to POST to a remote server. I've looked at the Google <a href="https://code.google.com/p/crypto-js/" rel="nofollow noreferrer">CryptoJS</a> to try to acheive this, along side a base64 library. Note that the key is the same as the $key var above. </p> <pre><code>var encrypted = CryptoJS.DES.encrypt(user.email, key).toString(); var base64 = base64.encode(encrypted); </code></pre> <p>The problem is that the encrypted string (and I have tried without the base64 encode/decode) when passed through <code>mcrypt_ecb</code> is garbage. Apparently there are different methods of triple DES encryption? </p> <p>How would I create a <code>mcrypt_ecb</code> compatible encrypted string in JavaScript?</p> </div>

DES加解密,Java和C里面的填充内容的问题

DES加解密的时候遇到一个问题:C语言中不足八位填充的是‘\0’,我在Java中也是填的这个,但是加密后传给C程序解密失败,两边加密出来的内容不一致!!求教,怎么解决啊!!!C币用完了 求好心人

为啥DES解密出错,求大佬解答

import java.util.Scanner; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.xml.bind.DatatypeConverter; import org.apache.commons.codec.binary.Hex; public class DES2 { public static void main(String[] args) { DESEncryption(); DESDecryption(); } public static void DESEncryption() { try { Scanner sc = new Scanner(System.in); System.out.println("请输入需要加密内容:"); String src = sc.nextLine(); System.out.println("请输入密钥:"); String str1 = sc.nextLine(); byte[] bytesKey = str1.getBytes(); DESKeySpec desKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = factory.generateSecret(desKeySpec); // DES加密 Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] result = cipher.doFinal(src.getBytes()); String hex = DatatypeConverter.printHexBinary(result); System.out.println("Hex:" + hex.toLowerCase()); System.out.println("DES加密:" + Hex.encodeHexString(result)); } catch (Exception e) { // TODO: handle exception } } public static void DESDecryption() { try { Scanner sc = new Scanner(System.in); System.out.println("请输入需要解密内容:"); String str1 = sc.nextLine(); System.out.println("请输入密钥:"); String str2 = sc.nextLine(); byte[] bytesKey = str2.getBytes(); DESKeySpec desKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = factory.generateSecret(desKeySpec); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] result2 = cipher.doFinal(str1.getBytes()); System.out.println("DES解密:" + new String(result2)); } catch (Exception e) { System.out.println("解密异常"); } } }

DES解密问题:通过密钥、偏移量加密正常,解密出错?

DES解密问题:通过密钥、偏移量加密正常,解密出错:Given final block not properly padded.那位大神遇到过这种问题。在线等。 # 问题 ``` package com.whiteink.pms.util; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; import java.security.Key; import java.util.Base64; public class DESUtil { static String key = "693207DB8148FBC9D8410179"; static String iv = "20190225"; static String encoding = "gb2312"; static String data = "{\"parkCode\":\"1\",\"plateNo\":\"京A11113\"}"; /** * <一句话功能描述>:加密 * <功能详细描述>: 将明文加密 * * @Param: key 密钥 * @Param keyiv 自定义偏移量(8字节) * @Param data 明文 * @Return: byte[] */ public static String des3EncodeCBC(byte[] key, byte[] keyiv, byte[] data) throws Exception { Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede"); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding"); IvParameterSpec ips = new IvParameterSpec(keyiv); cipher.init(Cipher.ENCRYPT_MODE, deskey, ips); return Base64.getEncoder().encodeToString(cipher.doFinal(data)); } /** * <一句话功能描述>:解密 * <功能详细描述>: 将密文转成明文 * * @Param: key 密钥 * @Param keyiv 偏移量 * @Param data 明文 * @Return: byte[] */ public static String des3DecodeCBC(byte[] key, byte[] keyiv, byte[] data) throws Exception { System.out.println(new String(data)); DESedeKeySpec dks = new DESedeKeySpec(key); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("desede"); SecretKey securekey = keyFactory.generateSecret(dks); // 解密 Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding"); IvParameterSpec ivp = new IvParameterSpec(keyiv); cipher.init(Cipher.DECRYPT_MODE, securekey, ivp); return Base64.getEncoder().encodeToString(cipher.doFinal(data)); } public static void main(String[] args) throws Exception{ String data = "{\"parkCode\":\"1\",\"plateNo\":\"京A11113\"}"; String mw = des3EncodeCBC(key.getBytes(), iv.getBytes(), data.getBytes("GB2312")); System.out.println(des3DecodeCBC(key.getBytes(), iv.getBytes(), mw.getBytes())); } } ``` # 解决方案 ===============解决方案=============== ``` package com.whiteink.pms.util; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; public class DESUtil { private static String encoding = "gb2312"; private static String data = "{\"parkCode\":\"1\",\"plateNo\":\"京A11113\"}"; public static String encrypt(String key, String iv, String data) throws Exception { SecretKey secretKey = new SecretKeySpec(key.getBytes(), "desede"); Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding"); IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ips); byte[] encryptData = cipher.doFinal(data.getBytes(encoding)); return Base64.getEncoder().encodeToString(encryptData); } public static void main(String[] args) throws Exception { String key = "693207DB8148FBC9D8410179"; String iv = "20190225"; String encryption = encrypt(key, iv, data); System.out.println(encryption); String decryption = decrypt(key, iv, encryption); System.out.println(decryption); } public static String decrypt(String key, String iv, String data) throws Exception { SecretKey secretKey = new SecretKeySpec(key.getBytes(), "desede"); Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding"); IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.DECRYPT_MODE, secretKey, ips); byte[] decryptData = cipher.doFinal(Base64.getDecoder().decode(data.getBytes(encoding))); return new String(decryptData, "GB2312"); } } ```

java写的DES的cbc工作模式解密时出现乱码

public static byte[] cbcdesDecrypt(byte[] data, byte rawKeyData[]) throws GeneralSecurityException { DESKeySpec keySpec=new DESKeySpec(rawKeyData); SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("DES"); SecretKey key=keyFactory.generateSecret(keySpec); Cipher cipher=Cipher.getInstance("DES/CBC/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(rawKeyData)); byte[] result=cipher.doFinal(data); return result; }

求采用DES对称加密算法-JAVA代码

【加密方法】: 采用DES对称加密算法,使用字符串“hnzt”生成加密的密钥 则组合的字符串为:851-2110599902&ZIQI&SONG&HKG&CN&1503560275539&24 加密后为: af5a8b0e4680161606b7a72de89295733e05f8e4aec1866056f2850df1e2578bc6bd35f2003534e15a271a5bb03876d047cc1c5c0c2e1913 加密的JAVA代码如下,为什么会报错 package com.test; import java.math.BigInteger; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import org.junit.Test; /** * 对称加密DES算法 * @author Administrator * */ public class DESTest { /** 算法名称 **/ static final String ALGORITHM = "DES"; /** 算法名称/加密模式/填充方式 **/ static final String CIPHER_ALGORITHM = "DES/ECB/pkcs5Padding"; /** 密钥,getBytes的长度必须大于等于8 **/ // static final String SECRET_KEY = "!@#$%^&*"; static final String SECRET_KEY = "hnzt"; @Test public void test() throws Exception { String data = "851-2110599902&ZIQI&SONG&HKG&CN&1503560275539&24"; //加密 String hex = encryption(data); System.out.println(hex); System.out.println("-----------------------------------------"); // 解密 String origin = decryption(hex); System.out.println(origin); } /** * 加密,返回16进制的字符串 * @param data * @return * @throws Exception */ private static String encryption(String data) throws Exception{ // 创建密钥 DESKeySpec desKeySpec = new DESKeySpec(SECRET_KEY.getBytes("UTF-8")); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // 加密 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] bs = cipher.doFinal(data.getBytes("UTF-8")); // 编码成16进制字符串 BigInteger bi = new BigInteger(1, bs); return bi.toString(16); } /** * 解密 * @param hex * @return * @throws Exception */ private static String decryption(String hex) throws Exception { // 解码16进制字符串 BigInteger bi = new BigInteger(hex, 16); byte[] bs = bi.toByteArray();// 该数组包含此 BigInteger 的二进制补码表示形式。 byte[] originBs = new byte[bs.length - 1]; byte[] target = bs; if (bs[0] == 0) { System.out.println("去补码..."); System.arraycopy(bs, 1, originBs, 0, originBs.length); // 去掉补码 target = originBs; } // 创建密钥 DESKeySpec desKeySpec = new DESKeySpec(SECRET_KEY.getBytes("UTF-8")); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // 解密 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptionBs = cipher.doFinal(target); return new String(decryptionBs, "UTF-8"); } } ![图片说明](https://img-ask.csdn.net/upload/201801/22/1516614091_339172.png) 而网上却可以,我代码写错了吗? ![图片说明](https://img-ask.csdn.net/upload/201801/22/1516613991_141077.png)

java 对称加密 加密文件夹的实现方式

想通过对称加密方式,AES或DES来实现加密文件夹,请问大家该如何实现呢;

用java对des解密,知道密钥和密文的了

已经知道密文为D6E54EE0CCD748C4E05C38197A020E02B1F206BB8BA8C6EA 密钥为:DF323TGR 想问下怎么弄它的明文 还有就是密钥为DF323TGR和DF323TGR34YR后者是可以的吗? 求大神解答下

DES加密不一致问题,求大神解决

各位大神 小弟在做一个文件传输项目 对方系统用的是c#写的des加解密算法 密钥:Bank2014 加密偏移量:Bank2014 加密模式:CipherMode.CBC、PaddingMode.PKCS5 块长度:64 文件编码:GBK 小弟这边用的是c写的加解密算法我就只设置了密钥:Bank2014 代码是参照大赛写的 位置在:http://www.iteye.com/topic/478024 目前的问题就是对方公司加密出来的文件跟我加密出来的文件不一样 我的代码是否需要设置加密偏移量呢 还是代码本身就有问题 求大神指点 先跪谢了

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你期望月薪4万,出门右拐,不送,这几个点,你也就是个初级的水平

先来看几个问题通过注解的方式注入依赖对象,介绍一下你知道的几种方式@Autowired和@Resource有何区别说一下@Autowired查找候选者的...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

字节跳动面试官竟然问了我JDBC?

轻松等回家通知

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

立即提问
相关内容推荐