Maison  >  Article  >  Java  >  Comment utiliser le cryptage et le décryptage Java 3DES

Comment utiliser le cryptage et le décryptage Java 3DES

php中世界最好的语言
php中世界最好的语言original
2018-06-04 13:36:432577parcourir

Cette fois, je vais vous montrer comment utiliser le cryptage et le décryptage Java 3DES, et quelles sont les précautions à prendre pour utiliser le cryptage et le décryptage Java 3DES. Ce qui suit est un cas pratique, jetons un coup d'œil.

<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写的算法加密解密-----------

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez faire attention au site Web php chinois Autres articles connexes !

Lecture recommandée :

Explication détaillée de l'utilisation des événements click, touch, tap dans le développement WEB mobile

REM utilisation relative de l'unité Partage de cas

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn