`
z2009zxiaolong
  • 浏览: 77182 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

MD5和DES加密算法

    博客分类:
  • Java
阅读更多

MD5加密生成的密钥是固定的32位,而Base64加密和DES加密,生成的密钥不是固定。

现在假如要将用户登录的密码进行加密并存入数据库,MD5加密与DES加密相结合的方式是不错的选择。因为DES加密可逆,但是较之MD5难破解些,一般银行卡账户使用的就是这种算法;另外MD5生成固定的32位密钥,便于在数据库中存储,字段长度不变,不会浪费空间。

下面就看看怎样进行加密吧。

  1. MD5加密工具类
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    /**
     * MD5加密工具类
     * 
     */
    public class Md5Util {
    
    	/**
    	 * 根据输入的字符串生成固定的32位MD5码
    	 * 
    	 * @param str
    	 *            输入的字符串
    	 * @return MD5码
    	 */
    	public final static String getMd5(String str) {
    		MessageDigest mdInst = null;
    		try {
    			mdInst = MessageDigest.getInstance("MD5");
    		} catch (NoSuchAlgorithmException e) {
    			e.printStackTrace();
    		}
    		mdInst.update(str.getBytes());// 使用指定的字节更新摘要
    		byte[] md = mdInst.digest();// 获得密文
    		return StrConvertUtil.byteArrToHexStr(md);
    	}
    }
    
    
    
    
    
    
     
  2. DES加密工具类
    import java.security.Key;
    import java.security.Security;
    
    import javax.crypto.Cipher;
    
    /**
     * DES加密工具类
     */
    public class DesUtil {
    
    	private static final String ENCRYPT_TYPE = "DES";
    	private static String defaultKey = "";// 字符串默认键值
    	private Cipher encryptCipher = null;// 加密工具
    	private Cipher decryptCipher = null;// 解密工具
    
    	public DesUtil() throws Exception {
    		this(defaultKey);
    	}
    
    	/**
    	 * 指定密钥构造方法
    	 * 
    	 * @param strKey
    	 *            指定的密钥
    	 * @throws Exception
    	 */
    	public DesUtil(String strKey) throws Exception {
    		Security.addProvider(new com.sun.crypto.provider.SunJCE());
    		Key key = getKey(strKey.getBytes());
    		encryptCipher = Cipher.getInstance(ENCRYPT_TYPE);
    		encryptCipher.init(Cipher.ENCRYPT_MODE, key);
    		decryptCipher = Cipher.getInstance(ENCRYPT_TYPE);
    		decryptCipher.init(Cipher.DECRYPT_MODE, key);
    	}
    
    	/**
    	 * 加密字节数组
    	 * 
    	 * @param arr
    	 *            需加密的字节数组
    	 * @return 加密后的字节数组
    	 * @throws Exception
    	 */
    	private byte[] encryptStr(byte[] arr) throws Exception {
    		return encryptCipher.doFinal(arr);
    	}
    
    	/**
    	 * 加密字符串
    	 * 
    	 * @param strIn
    	 *            需加密的字符串
    	 * @return 加密后的字符串
    	 * @throws Exception
    	 */
    	public String encrypt(String strIn) throws Exception {
    		return StrConvertUtil.byteArrToHexStr(encryptStr(strIn.getBytes()));
    	}
    
    	/**
    	 * 解密字节数组
    	 * 
    	 * @param arr
    	 *            需解密的字节数组
    	 * @return 解密后的字节数组
    	 * @throws Exception
    	 */
    	private byte[] decryptStr(byte[] arr) throws Exception {
    		return decryptCipher.doFinal(arr);
    	}
    
    	/**
    	 * 解密字符串
    	 * 
    	 * @param strIn
    	 *            需解密的字符串
    	 * @return 解密后的字符串
    	 * @throws Exception
    	 */
    	public String decrypt(String strIn) throws Exception {
    		return new String(decryptStr(StrConvertUtil.hexStrToByteArr(strIn)));
    	}
    
    	/**
    	 * 从指定字符串生成密钥,密钥所需的字节数组长度为8位。不足8位时后面补0,超出8位只取前8位
    	 * 
    	 * @param arrBTmp
    	 *            构成该字符串的字节数组
    	 * @return 生成的密钥
    	 */
    	private Key getKey(byte[] arrBTmp) {
    		byte[] arrB = new byte[8];// 创建一个空的8位字节数组(默认值为0)
    		// 将原始字节数组转换为8位
    		for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
    			arrB[i] = arrBTmp[i];
    		}
    		Key key = new javax.crypto.spec.SecretKeySpec(arrB, ENCRYPT_TYPE);// 生成密钥
    		return key;
    	}
    
    }
    
    
    
    
    
    
     
  3. 字符串转换工具类
    /**
     * 字符串转换工具类
     * 
     */
    public class StrConvertUtil {
    
    	/**
    	 * 将byte数组转换为表示16进制值的字符串,如:byte[]{8,18}转换为:0813, 和public static byte[]
    	 * hexStrToByteArr(String strIn) 互为可逆的转换过程
    	 * 
    	 * @param arrB
    	 *            需要转换的byte数组
    	 * @return 转换后的字符串
    	 */
    	public static String byteArrToHexStr(byte[] arrB) {
    		int iLen = arrB.length;
    		// 每个byte(8位)用两个(16进制)字符才能表示,所以字符串的长度是数组长度的两倍
    		StringBuffer sb = new StringBuffer(iLen * 2);
    		for (int i = 0; i < iLen; i++) {
    			int intTmp = arrB[i];
    			while (intTmp < 0) {// 把负数转换为正数
    				intTmp = intTmp + 256;
    			}
    			if (intTmp < 16) {// 小于0F的数需要在前面补0
    				sb.append("0");
    			}
    			sb.append(Integer.toString(intTmp, 16));
    		}
    		return sb.toString();
    	}
    
    	/**
    	 * 将表示16进制值的字符串转换为byte数组,和public static String byteArrToHexStr(byte[] arrB)
    	 * 互为可逆的转换过程
    	 * 
    	 * @param strIn
    	 *            需要转换的字符串
    	 * @return 转换后的byte数组
    	 */
    	public static byte[] hexStrToByteArr(String strIn) {
    		byte[] arrB = strIn.getBytes();
    		int iLen = arrB.length;
    		// 两个(16进制)字符表示一个字节(8位),所以字节数组长度是字符串长度除以2
    		byte[] arrOut = new byte[iLen / 2];
    		for (int i = 0; i < iLen; i = i + 2) {
    			String strTmp = new String(arrB, i, 2);
    			arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
    		}
    		return arrOut;
    	}
    
    }
    
    
    
    
    
    
     
  4. 最后当然是测试类咯
    public class Test {
    	public static void main(String[] args) {
    		try {
    			DesUtil des = new DesUtil("Java");// 自定义密钥
    			String src = "需要进行加密的字符串";
    			String src1 = des.encrypt(src);
    			String src2 = des.decrypt(src1);
    			String src3 = Md5Util.getMd5(src1);
    			System.out.println("DES加密前的字符:" + src + ",长度:" + src.length());
    			System.out.println("DES加密后的字符:" + src1 + ",长度:" + src1.length());
    			System.out.println("DES解密后的字符:" + src2 + ",长度:" + src2.length());
    			System.out.println("MD5加密后的字符:" + src3 + ",长度:" + src3.length());
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    
    
    
    
    
    
     
  5. 测试结果输出
    DES加密前的字符:需要进行加密的字符串,长度:10
    DES加密后的字符:d50ef6bf3e3e51585297c0120f76a65f9d52d38e4cf5f47946124a1b8488e3b9,长度:64
    DES解密后的字符:需要进行加密的字符串,长度:10
    MD5加密后的字符:842913073af5f2555c1042832eba999f,长度:32
    
    
    
    
    
    
     
  6. 最后附上源代码。
  • des.rar (1.9 KB)
  • 描述: MD5加密和DES加密
  • 下载次数: 96
分享到:
评论
1 楼 小无敌H 2016-01-04  
[b][b][b][b][b][b][b][b][b][b][b][b][b][b]                  [/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]     

相关推荐

    MD5 RAS DES 加密算法详解

    ### MD5 RAS DES 加密算法详解 ...综上所述,MD5、RSA和DES三种加密算法各自在信息安全的不同领域发挥着关键作用,从数据完整性校验、安全通信到数据加密,它们共同构建了现代网络安全的基础框架。

    常用MD5加密算法和3-DES加密算法java实现

    ### 常用MD5加密算法和3-DES加密算法Java实现 在现代软件开发过程中,数据的安全性变得越来越重要。对于数据传输和存储过程中的安全性保障,加密技术发挥着至关重要的作用。本文将详细介绍如何在Java环境中实现两种...

    ASP.NET的MD5和DES加密和解密算法

    ASP.NET的MD5和DES加密和解密算法 非常好的资源 欢迎大家参考

    python之des加密算法

    根据提供的文件信息,本文将重点介绍Python中的DES加密算法,并简要提及MD5加密算法。同时,文中还将涉及Python中的图形界面编程库Tkinter的基本用法。以下是对这些知识点的详细解析。 ### 一、Python中的DES加密...

    MD5和3DES加密算法

    DELPHI源码内容包括MD5算法,DES加解密算法,3DES加解密算法

    3个著名加密算法(MD5、RSA、DES)的解析

    MD5、RSA和DES分别是散列函数、非对称加密算法和对称加密算法领域的经典代表。虽然这些算法随着时间的推移面临着不同程度的安全挑战,但它们仍然是信息安全领域的重要组成部分。理解这些算法的基本原理和技术细节...

    vc++ DES加密算法

    总之,"vc++ DES加密算法"项目提供了使用Microsoft Visual C++实现DES加密的实例,结合MD5功能,可以用于数据的安全存储和传输。通过分析和学习项目中的源代码,开发者不仅可以掌握DES算法,还能提升在C++环境下处理...

    加密算法DES 3DES MD5 RSA算法大全

    本文将详细介绍四种常见的加密算法:DES、3DES、MD5和RSA,这些算法在Java编程语言中得到了广泛应用。 首先,我们来了解DES(Data Encryption Standard),这是一种对称加密算法,由IBM在1970年代开发并被美国国家...

    DES,MD5,RSA加密算法

    DES,MD5,RSA加密算法:相关博文:http://www.cnblogs.com/tianzhijiexian/p/4047368.html

    MD5 3DES 双重加密 demo

    MD5和3DES都是在信息安全领域广泛使用的加密算法,它们各有不同的应用场景和安全特性。MD5主要用于数据完整性校验,而3DES则是一种对称加密算法,常用于保护数据的机密性。在这个"MD5 3DES 双重加密 demo"中,我们将...

    C#MD5,DES加密解密

    通过这些代码,你可以了解如何在C#中实现MD5和DES加密解密,并理解它们的基本工作原理。然而,为了提高安全性,应当考虑使用更现代的加密标准,如AES,以及更安全的哈希函数,例如SHA-256。在处理敏感数据时,确保...

    Delphi加密算法大全2DES_3DES_3DES3_AES_BASE64_BLOWFISH_CRC_DES_MD5_RSA_SHA

    本资料包涵盖了多个常见的加密算法,包括2DES、3DES、3DES3、AES、Base64、Blowfish、CRC、DES、MD5以及RSA和SHA系列。以下将对这些算法进行详细介绍。 1. **2DES(双密钥数据加密标准)**:基于DES(Data ...

    DES加密算法的delphi源码

    总的来说,通过学习这个DES加密算法的Delphi源码,你不仅可以掌握DES加密算法的原理和实现,还能提升你在Delphi编程中的实践能力,进一步理解和运用面向对象编程的思想。这对于任何想要深入研究加密技术或者使用...

    MD5字符串加密和DES加密

    `EncodeTest`可能是包含示例代码或程序的文件,通常这样的文件会提供如何在VC++环境中实现MD5和DES/3DES加密的示例。这个文件可能包含了类定义、函数实现以及如何使用这些函数的代码片段,通过这些代码,你可以学习...

    Delphi加密代码(含MD5,DES等多种加密方式)

    在Delphi中实现MD5和DES加密,可以利用内置的Crypto单位或者第三方库,如 Indy 或 Bouncy Castle。例如,使用内置的TIdHashMD5组件进行MD5散列,通过TDes类实现DES加密。这些组件提供了易于理解的API,开发者可以...

    DES加密解密MD5加密

    在Windows Forms(Winform)环境中,我们可以创建一个简单的应用程序来实现DES加密和MD5加密的功能。DEncrypt.cs.txt和DEncrypt.Designer.cs是C#项目中的两个文件,其中DEncrypt.cs是主要的代码文件,包含了加密解密...

    各种Des加密算法

    - `desc.c` 可能包含了DES加密算法的实现。 - `r_enhanc.c` 可能是某种增强版DES的实现,比如3DES或DESX。 - `rsa.c` 涉及RSA公钥加密算法,这与DES不同,RSA是非对称加密,通常用于数字签名和密钥交换。 - `nn.c`、...

    js加密算法3des和md5-base64和常用工具

    本文将深入探讨三种常见的加密算法:3DES、MD5以及Base64,并介绍它们在实际应用中的工具和用途。 首先,我们来了解一下3DES(Triple DES,三重数据加密标准)。3DES是一种对称加密算法,它是DES(Data Encryption ...

    JAVA-MD5pass_src.rar_MD5 JAVA_des算法_java 加密_加密算法

    本文将深入探讨MD5和DES两种加密算法,以及它们在Java中的实现。首先,我们来看MD5(Message-Digest Algorithm 5),它是一种广泛使用的哈希函数,产生一个128位(16字节)的散列值,通常用32个十六进制数字表示。 ...

Global site tag (gtag.js) - Google Analytics