关闭

Android实现DES和3DES算法

标签: JavaAndroid加密算法
1832人阅读 评论(0) 收藏 举报
分类:

本文实现的Android下的是DES和3DES算法,Java同样也适用。

DES算法如下:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class DESUtils {
	private static byte[] parse(String str) {
		byte[] b = new byte[str.length() / 2];
		for (int i = 0, n = str.length(); i < n; i += 2) {
			b[i / 2] = (byte) (Integer.parseInt(str.substring(i, i + 2), 16));
		}
		return b;
	}

	/**
	 * 加密
	 * @param src
	 * @param password
	 * @return
	 */
	public static byte[] enCode(byte[] src, String password) {
		try {
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			SecretKey key = keyFactory.generateSecret(new DESKeySpec(parse(password)));// 密钥
			Cipher cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.ENCRYPT_MODE, key);
			return cipher.doFinal(src);// 明文
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;

	}

	/**
	 * 解密
	 * @param src
	 * @param password
	 * @return
	 * @throws Exception
	 */
	public static byte[] deCode(byte[] src, String password) throws Exception {
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
		SecretKey key = keyFactory.generateSecret(new DESKeySpec(parse(password)));// 密钥
		Cipher cipher = Cipher.getInstance("DES");
		cipher.init(Cipher.DECRYPT_MODE, key);
		return cipher.doFinal(src);// 密文
	}
}


3DES算法是进行了3次DES算法。

E是代表加密,D代表解密,K1,K2,K3代表3个密钥。加密解密都是用DES算法,一般来说密钥需要3个或两个密钥,如果3个密钥都相同,则变成了DES算法,如果对加密强度要求没有那么高,可以用两个密钥,对应的是K1和K3密钥相同。

3DES加密过程:EK1(加密)-->DK2(解密)-->EK3(加密)

3DES解密过程:DK3(解密)-->EK2(加密)-->DK1(解密)


3DES算法如下:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class DES3Utils {

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;
    }

    //转换成十六进制字符串
    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();
    }
}


调用

//DES
	//DES加密
	byte[] en = DESUtils.enCode(hexStringToBytes("3132333435363738"), "A1A2A3A4A5A6A7A8");
	//DES解密	
	try {
		byte[] dn = DESUtils.deCode(hexStringToBytes("B1C3D2A87DBDB68FA73FBBBCD6F083AC"), "A1A2A3A4A5A6A7A8");
			
	} catch (Exception e) {
		e.printStackTrace();
	}
	
//3DES
	//3DES加密
	String key = 	"A1A2A3A4A5A6A7A8"	//K1密钥
			+"B1B2B3B4B5B6B7B8"	//K2密钥
			+"A1A2A3A4A5A6A7A8";	//K3密钥
	byte[] result = DES3Utils.encryptMode(hexStringToBytes(key), hexStringToBytes("3132333435363738"));

	//3DES解密
	byte[] dnresult = DES3Utils.decryptMode(hexStringToBytes(key), hexStringToBytes("B0920ED6520EAF752E22A1F49B243353"));
		





//***************************************************************************************
	//实现String到byte的转换
	public static byte[] hexStringToBytes(String string) {
        String hexString = string.replaceAll(" ", "").toUpperCase();


        if (hexString.length() <= 0)
            return null;


        int length = hexString.length() / 2;
        char[] hexChars = hexString.toCharArray();
        byte[] d = new byte[length];
        for (int i = 0; i < length; i++) {
            int pos = i * 2;
            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
        }
        return d;
    }	



DES的明文是3132333435363738,密钥是A1A2A3A4A5A6A7A8,加密后得到B1C3D2A87DBDB68FA73FBBBCD6F083AC,这里面前面16位是明文加密而来的,后面的A73FBBBCD6F083AC是由0808080808080808加密而来的。这8个08是算法自动填充上去的。3DES同样会填充8个08上去再加密。B0920ED6520EAF752E22A1F49B243353后面的2E22A1F49B243353是由填充的0808080808080808加密而来。




0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

使用3DES加密与解密实习Android端和后台的数据加密传输

这篇主要讲怎么进行加密的安全传输。通过双发所持有的秘钥进行解密,具有很高的安全性。 下面就不多说啦直接看代码。 Android端: ThreeDesUtil加密解密类: package com...
  • linzhiqiang0316
  • linzhiqiang0316
  • 2015-09-11 17:20
  • 1809

Android中使用DES加密算法

import java.security.Key; import java.security.spec.AlgorithmParameterSpec; import java.util.Locale;...
  • aiynmimi
  • aiynmimi
  • 2016-09-23 17:52
  • 2917

Android客户端与服务器端通过DES加密认证

由于Android应用没有像web开发中的session机制,所以采用PHPSESSID的方式,是没有办法获取客户端登录状态的。 这种情况下,如何在用户登录后,服务器端获取用户登录状态并保持,就必须...
  • spring21st
  • spring21st
  • 2011-08-29 18:28
  • 12312

Android数据加密DES、3DES、AES

在Android开发中,可能会遇到对数据进行加密的情况。典型的对称加密算法有DES、3DES、AES等。 一.DES     DES算法的入口参数有三个:Key、Data、Mode。其中Key为7...
  • ldld1717
  • ldld1717
  • 2016-11-09 20:46
  • 956

Android端3DES加密

加密感脚好高大上,直接复制代码。public class Constants { // 密钥 public final static String secretKey = "0535Y...
  • u013318615
  • u013318615
  • 2015-11-18 14:33
  • 688

Android实现DES和3DES算法

本文实现的Android下的是DES和3DES算法,Java同样也适用。 DES算法如下: import javax.crypto.Cipher; import javax.crypto.Secret...
  • loongago
  • loongago
  • 2016-09-01 08:34
  • 1832

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

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992     在前面的文章里面,我们讨论了DES算法,同时也明白了如何才能保证不同平台下的加密和解密结果的一...
  • jdsjlzx
  • jdsjlzx
  • 2015-01-04 10:37
  • 4832

DES/3DES/AES 加密算法区别

DES DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解...
  • u010568345
  • u010568345
  • 2014-11-20 23:48
  • 2028

Imooc_JAVA实现对称加密2-1 JAVA-对称加密算法3DES

原视频地址 Imooc_JAVA实现对称加密2-1 JAVA-对称加密算法3DESpackage DES;import java.security.SecureRandom;import javax...
  • jluzh04140717
  • jluzh04140717
  • 2016-12-04 00:20
  • 166

android加密解密算法之3DES算法用例

android加密算法很多:DES ,AES,3DES等等。详情请google,baidu。 des的使用安全行很低,再次我们详细了解下3DES. 3DES顾名思义,就是对des加密算法进行得改进...
  • dulzihi
  • dulzihi
  • 2015-08-17 17:04
  • 849
    个人资料
    • 访问:36367次
    • 积分:678
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:1篇
    • 译文:0篇
    • 评论:6条
    最新评论