Home  >  Article  >  Java  >  How to use java 3DES encryption and decryption

How to use java 3DES encryption and decryption

php中世界最好的语言
php中世界最好的语言Original
2018-06-04 13:36:432635browse

This time I will show you how to use java 3DES encryption and decryption, and what are the precautions for using java 3DES encryption and decryption. The following is a practical case, let's take a look.

<pre name="code" class="java">Java写的加密解密算法及调用范例

1、.JAVA算法范例

package Common.JUtility;

 

import javax.crypto.*;

import javax.crypto.spec.SecretKeySpec;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

 

public class EncryptUtils {

 

    /// <summary>

    /// 3des解码

    /// </summary>

    /// <param name="value">待解密字符串</param>

    /// <param name="key">原始密钥字符串</param>

    /// <returns></returns>

    public static String Decrypt3DES(String value, String key) throws Exception {

        byte[] b = decryptMode(GetKeyBytes(key), Base64.decode(value));

        return new String(b);

    }

 

    /// <summary>

    /// 3des加密

    /// </summary>

    /// <param name="value">待加密字符串</param>

    /// <param name="strKey">原始密钥字符串</param>

    /// <returns></returns>

    public static String Encrypt3DES(String value, String key) throws Exception {

        String str = byte2Base64(encryptMode(GetKeyBytes(key), value.getBytes()));

        return str;

    }

 

    //计算24位长的密码byte值,首先对原始密钥做MD5算hash值,再用前8位数据对应补全后8位

    public static byte[] GetKeyBytes(String strKey) throws Exception {

        if (null == strKey || strKey.length() < 1)

            throw new Exception("key is null or empty!");

 

        java.security.MessageDigest alg = java.security.MessageDigest.getInstance("MD5");

        alg.update(strKey.getBytes());

        byte[] bkey = alg.digest();

        System.out.println("md5key.length=" + bkey.length);

        System.out.println("md5key=" + byte2hex(bkey));

        int start = bkey.length;

        byte[] bkey24 = new byte[24];

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

            bkey24[i] = bkey[i];

        }

        for (int i = start; i < 24; i++) {//为了与.net16位key兼容

            bkey24[i] = bkey[i - start];

        }

 

        System.out.println("byte24key.length=" + bkey24.length);

        System.out.println("byte24key=" + byte2hex(bkey24));

        return bkey24;

    }

 

    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) {

            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) {

            e1.printStackTrace();

        } catch (javax.crypto.NoSuchPaddingException e2) {

            e2.printStackTrace();

        } catch (java.lang.Exception e3) {

            e3.printStackTrace();

        }

        return null;

    }

 

    //转换成base64编码

    public static String byte2Base64(byte[] b) {

        return Base64.encode(b);

    }

 

    //转换成十六进制字符串  

    public static String byte2hex(byte[] b) {

        String hs = "";

        String stmp = "";

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

            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();

    }

}

 

2、JAVA 算法调用范例

package test.com;

 

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

import Common.JUtility.EncryptUtils;//用原始密钥经MD5转换和补位后的新密钥来做3DES加密解密

 

public class Test3DES {

   

    public static void main(String[] args) {

        String key = "abcd1234";

        String password = "password";

        System.out.println("key=" + key + ",password=" + password);

        System.out.println();

        System.out.println("----------示例开始:使用java写的算法加密解密-----------");

       try {

            String encrypt = "";

            String decrypt = "";

           byte[] bkey = EncryptUtils.GetKeyBytes(key);

            encrypt = EncryptUtils.byte2Base64(EncryptUtils.encryptMode(bkey, password.getBytes()));

            System.out.println("用预转换密钥算加密结果=" + encrypt);

            System.out.println("加密后base64表示=" + EncryptUtils.byte2hex(Base64.decode(encrypt)));

            System.out.println("调用原始密钥算加密结果=" + EncryptUtils.Encrypt3DES(password, key));

 

           try {

                decrypt = new String(EncryptUtils.decryptMode(bkey, Base64.decode(encrypt)));

                System.out.println("用预转换密钥算解密结果=" + decrypt);

                System.out.println("调用原始密钥算解密结果=" + EncryptUtils.Decrypt3DES(encrypt, key));

            } catch (Exception ex) {

                System.out.println("Exception:" + ex.getMessage());

            }

        } catch (Exception ex) {

            System.out.println("Exception:" + ex.getMessage());

        }

        System.out.println("----------示例结束:使用java写的算法加密解密-----------");

    }

}

 

3、(7)的运算结果

key=abcd1234,password=password

 

----------示例开始:使用java写的算法加密解密-----------

md5key.length=16

md5key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF

byte24key.length=24

byte24key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF:E1:9D:5C:D5:AF:03:78:DA

用预转换密钥算加密结果=ftwPzxFH4WpzT4Orq8uSLQ==

 

加密后base64表示=7E:DC:0F:CF:11:47:E1:6A:73:4F:83:AB:AB:CB:92:2D

md5key.length=16

md5key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF

byte24key.length=24

byte24key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF:E1:9D:5C:D5:AF:03:78:DA

调用原始密钥算加密结果=ftwPzxFH4WpzT4Orq8uSLQ==

 

用预转换密钥算解密结果=password

md5key.length=16

md5key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF

byte24key.length=24

byte24key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF:E1:9D:5C:D5:AF:03:78:DA

调用原始密钥算解密结果=password

----------示例结束:使用java写的算法加密解密-----------

I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to the php Chinese website Other related articles!

Recommended reading:

Detailed explanation of the use of click, touch, tap events in mobile WEB development

REM relative unit usage Case Studies

The above is the detailed content of How to use java 3DES encryption and decryption. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn