关闭

android 数据安全中常用的加密算法 4 MD5 与3DES

标签: 数据安全加密md53des算法
1919人阅读 评论(0) 收藏 举报
分类:

android 数据安全中常用的加密算法 4 MD5 与3DES


一、MD5算法

 MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。MD5算法的使用不需要支付任何版权费用。  MD5有如下特点:原理参见:http://blog.csdn.net/forgotaboutgirl/article/details/7258109
    输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
    不同的输入得到的不同的结果(唯一性);
    根据128位的输出结果不可能反推出输入的信息(不可逆); 

  首先MD5是不可逆的,只能加密而不能解密。比如明文是1225627,得到MD5加密后的字符串是:14F2AE15259E2C276A095E7394DA0CA9  但不能由后面一大串倒推出1225627.因此可以用来存储用户输入的密码在服务器上。现在下载文件校验文件是否中途被篡改也是用的它, 无论在Android上还是pc上用java实现MD5都比较容易,因为java已经把它做到了java.security.MessageDigest里。

下面是一个MD5Util.java类:

import java.security.MessageDigest;  
public class MD5Util {  
    public final static String getMD5String(String s) {  
        char hexDigits[] = { '0', '1', '2', '3', '4',  
                '5', '6', '7', '8', '9',  
                'A', 'B', 'C', 'D', 'E', 'F' };  
        try {  
            byte[] btInput = s.getBytes();  
            //获得MD5摘要算法的 MessageDigest 对象  
            MessageDigest mdInst = MessageDigest.getInstance("MD5");  
            //使用指定的字节更新摘要  
            mdInst.update(btInput);  
            //获得密文  
            byte[] md = mdInst.digest();  
            //把密文转换成十六进制的字符串形式  
            int j = md.length;  
            char str[] = new char[j * 2];  
            int k = 0;  
            for (int i = 0; i < j; i++) {  
                byte byte0 = md[i];  
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];  
                str[k++] = hexDigits[byte0 & 0xf];  
            }  
            return new String(str);  
        }  
        catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        }  
    }  
} 


二、3DES算法

数据加密标准DES:

DES的原始思想可以参照二战德国的恩尼格玛机,其基本思想大致相同。传统的密码加密都是由古代的循环移位思想而来,恩尼格玛机在这个基础之上进行了扩散模糊。但是本质原理都是一样的。现代DES在二进制级别做着同样的事:替代模糊,增加分析的难度.

加密原理

DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的第8位作为奇偶校验位),产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 轮循环,使用异或置换代换移位操作四种基本运算。

三重DES

    3DES,顾名思义,就是对DES加密算法的改进,3DES通过对每个数据进行3次DES加密,从而降低被破解的可能性。

     如果我们要使用3DES加密,需要以下几个步骤

    ①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象

        SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);    

    ②根据算法实例化Cipher对象。它负责加密/解密

        Cipher c1 = Cipher.getInstance(Algorithm);    

    ③传入加密/解密模式以及SecretKey密钥对象,实例化Cipher对象

        c1.init(Cipher.ENCRYPT_MODE, deskey);    

    ④传入字节数组,调用Cipher.doFinal()方法,实现加密/解密,并返回一个byte字节数组

        c1.doFinal(src);

 

具体的代码实现过程如下:

import java.io.UnsupportedEncodingException;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class DES3Utils {

	// 定义加密算法,DESede即3DES
	private static final String Algorithm = "DESede";
	// 加密密钥
	private static final String PASSWORD_CRYPT_KEY = "zhaokaiqiang1992";

	/**
	 * 加密方法
	 * @param src
	 *            源数据的字节数组
	 * @return
	 */
	public static byte[] encryptMode(byte[] src) {
		try {
			// 生成密钥
			SecretKey deskey = new SecretKeySpec(
					build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);
			// 实例化Cipher
			Cipher cipher = Cipher.getInstance(Algorithm);
			cipher.init(Cipher.ENCRYPT_MODE, deskey);
			return cipher.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;
	}

	/**
	 * 解密函数
	 * @param src
	 *            密文的字节数组
	 * @return
	 */
	public static byte[] decryptMode(byte[] src) {
		try {
			SecretKey deskey = new SecretKeySpec(
					build3DesKey(PASSWORD_CRYPT_KEY), 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;
	}

	/**
	 * 根据字符串生成密钥24位的字节数组
	 * @param keyStr
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static byte[] build3DesKey(String keyStr)
			throws UnsupportedEncodingException {
		byte[] key = new byte[24];
		byte[] temp = keyStr.getBytes("UTF-8");

		if (key.length > temp.length) {
			System.arraycopy(temp, 0, key, 0, temp.length);
		} else {
			System.arraycopy(temp, 0, key, 0, key.length);
		}
		return key;
	}
}



1
0
查看评论

AES 3DES MD5 Base64区别

AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。 3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久...
  • dcjxrk
  • dcjxrk
  • 2016-01-29 10:48
  • 1648

加密算法详解 DES、3DES、AES、RSA、MD5、sha1

DES、3DES、AES、RSA、MD5、sha1 加密算法总结 一、简介 DES:全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法;DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。1999年1月,distributed.net...
  • jintiaozhuang
  • jintiaozhuang
  • 2017-08-08 14:58
  • 708

Android比DES加密更安全的算法——3DES加密算法

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992     在前面的文章里面,我们讨论了DES算法,同时也明白了如何才能保证不同平台下的加密和解密结果的一致性。但是DES作为出现了很长时间的一种加密算法,随着计算机运算能力的加强,DE...
  • jdsjlzx
  • jdsjlzx
  • 2015-01-04 10:37
  • 4883

3DES加密算法简析

3DES加密算法并非什么新的加密算法,而是DES算法的另一种模式。是现在比较常用的一种对称加密算法,比起DES来说安全性更高。该算法的加解密过程分别是对明文/密文数据进行三次DES加密或解密,得到相应的密文或明文。假设EK()和DK()分别表示DES的加密和解密函数,P表示明文,C表示密文,那么加解...
  • jimi_yuan
  • jimi_yuan
  • 2016-01-26 22:51
  • 4072

常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES

1、对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法...
  • qq_35873847
  • qq_35873847
  • 2017-09-19 11:54
  • 336

Java和C#中3DES的加密与解密

最近在工作中遇到将Java环境的一个用户ID用表单形式传递给.net环境做校验,考虑到不能将用户ID作为明文传递,因此利用简单的3DES进行加密解密操作。 需要注意的就是: (1)两种环境下3DES加密解密的一致性问题:C#会对解密生成的byte在不满足长度16时,自动填充'/0'...
  • buaa_shang
  • buaa_shang
  • 2015-12-10 11:04
  • 2462

三大常用机密算法原理与基础使用MD5、3DES、RSA

概述数据在存储和传输的过程中,可能会面临被窃听、篡改等风险。同时,还可能有人伪装成为客户端进行破坏性的操作,因此为了保证数据的机密性、完整性、不可否认性、认证功能,我们通常对数据的存储和传输进行加密。这里我学习了生产中常用的三种加密算法,MD5、3DES、RSA。1. MD5MD5,全名Messag...
  • muskter
  • muskter
  • 2017-05-02 19:28
  • 671

Android常见加密算法(MD5加密)

MD5加密是不可逆的,加密后字符串可取16位或32位。一定注意,MD5加密区分大小写,加密出来的结果不同。 public class MD5Util { private static char hexDigits[] = { '0', '1', '2&...
  • MinoZhang
  • MinoZhang
  • 2016-11-15 12:24
  • 1053

android 数据安全中常用的加密算法 AES

AES:高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院...
  • wangdong_0428
  • wangdong_0428
  • 2016-08-09 16:27
  • 158

常见加密算法分,用途,原理以及比较

常见加密算法分,用途,原理以及比较   密码学简介 据记载,公元前400年,古希腊人发明了置换密码。1881年世界上的第一个电话保密专利出现。在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用。 随着信息化和数字化社会的发...
  • u014774781
  • u014774781
  • 2015-09-19 22:31
  • 5174
    个人资料
    • 访问:39929次
    • 积分:865
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:3篇
    • 译文:0篇
    • 评论:1条
    文章分类