`
xiangxm
  • 浏览: 67121 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

3DES加密

    博客分类:
  • Java
阅读更多
package com.xiangxm.javatest.evangesoftdemo;

import java.security.Security;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

/*字符串 DESede(3DES) 加密解密*/

public class ThreeDes {

	/**
	 * 
	 * @param args在java中调用sun公司提供的3DES加密解密算法时
	 *            ,需要使
	 * 
	 *            用到$JAVA_HOME/jre/lib/目录下如下的4个jar包:
	 * 
	 *            jce.jar
	 * 
	 *            security/US_export_policy.jar
	 * 
	 *            security/local_policy.jar
	 * 
	 *            ext/sunjce_provider.jar
	 * 
	 */

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

			// TODO: handle exception

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

			// TODO: handle exception

			e1.printStackTrace();

		} catch (javax.crypto.NoSuchPaddingException e2) {

			e2.printStackTrace();

		} catch (java.lang.Exception e3) {

			e3.printStackTrace();

		}

		return null;

	}

	public static void main(String[] args) {

		// TODO Auto-generated method stub

		// 添加新安全算法,如果用JCE就要把它添加进去

		Security.addProvider(new com.sun.crypto.provider.SunJCE());

		final byte[] keyBytes = { 0x11, 0x22, 0x4F, 0x58,

		(byte) 0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51,

		(byte) 0xCB,

		(byte) 0xDD, 0x55, 0x66, 0x77, 0x29, 0x74,

		(byte) 0x98, 0x30, 0x40, 0x36,

		(byte) 0xE2

		}; // 24字节的密钥

		String szSrc = "大公司的分公司的分公司的风格中华人民共和国感谢法";

		System.out.println("加密前的字符串:" + szSrc);

		byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());

		System.out.println("加密后的字符串:" + new String(encoded));

		byte[] srcBytes = decryptMode(keyBytes, encoded);

		System.out.println("解密后的字符串:" + (new String(srcBytes)));

	}

}



----------------------------下面来自Oschina---------------------------------
package com.xiangxm.javatest.evangesoftdemo;

import java.io.ByteArrayOutputStream;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;

/*
 *<p>
 *</p>
 *@author xiangxm
 *version  1.0
 *2013-3-23
 *
 *
 */

/**
 *字符串 DESede(3DES) 加密
 */
public class Test3DES {
	private static final String Algorithm = "DESede"; // 定义 加密算法,可用
	// DES,DESede,Blowfish
	private static final String hexString = "0123456789ABCDEF";

	/**
	 * 
	 * @param keybyte
	 *            加密密钥,长度为24字节
	 * @param src
	 *            字节数组(根据给定的字节数组构造一个密钥。 )
	 * @return
	 */
	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;
	}

	/**
	 * 
	 * @param keybyte
	 *            密钥
	 * @param src
	 *            需要解密的数据
	 * @return
	 */
	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;
	}

	/**
	 * 字符串转为16进制
	 * 
	 * @param str
	 * @return
	 */
	public static String encode(String str) {
		// 根据默认编码获取字节数组
		byte[] bytes = str.getBytes();
		StringBuilder sb = new StringBuilder(bytes.length * 2);

		// 将字节数组中每个字节拆解成2位16进制整数
		for (int i = 0; i < bytes.length; i++) {
			sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
			sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
		}
		return sb.toString();
	}

	/**
	 * 
	 * @param bytes
	 * @return 将16进制数字解码成字符串,适用于所有字符(包括中文)
	 */
	public static String decode(String bytes) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream(
				bytes.length() / 2);
		// 将每2位16进制整数组装成一个字节
		for (int i = 0; i < bytes.length(); i += 2)
			baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString
					.indexOf(bytes.charAt(i + 1))));
		return new String(baos.toByteArray());
	}

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

	public static void main(String[] args) {
		// 添加新安全算法,如果用JCE就要把它添加进去
		// 这里addProvider方法是增加一个新的加密算法提供者(个人理解没有找到好的答案,求补充)
		Security.addProvider(new com.sun.crypto.provider.SunJCE());
		// byte数组(用来生成密钥的)
		final byte[] keyBytes = { 0x11, 0x22, 0x4F, 0x58, (byte) 0x88, 0x10,
				0x40, 0x38, 0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD,
				0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36,
				(byte) 0xE2 };
		String szSrc = "This is a 3DES test. 测试";
		System.out.println("加密前的字符串:" + szSrc);

		byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());
		System.out.println("加密后的字符串:" + new String(encoded));

		byte[] srcBytes = decryptMode(keyBytes, encoded);
		System.out.println("解密后的字符串:" + new String(srcBytes));
		// ------------------------------------------------------------
		String byt = "字符串转换为16进制";
		byt = encode(byt);
		System.out.println(byt);
		byt = decode(byt);
		System.out.println(byt);

	}
}
分享到:
评论
2 楼 xiangxm 2013-04-10  
xurichusheng 写道
一些涉及到密码保存的就需要加密/解密了。
不需要解密的密码,如登录密码,使用 md5 加密;
需要解密的密码,就可以使用这样的方式加密/解密 了。

  多谢海哥指点
1 楼 xurichusheng 2013-04-10  
一些涉及到密码保存的就需要加密/解密了。
不需要解密的密码,如登录密码,使用 md5 加密;
需要解密的密码,就可以使用这样的方式加密/解密 了。

相关推荐

    3DES加密解密工具

    标题中的“3DES加密解密工具”指的是一个用于执行三重数据加密标准(3DES,Triple DES)的软件工具,这种工具通常用于保护敏感数据的安全,确保信息在传输过程中的机密性。3DES是DES(Data Encryption Standard,...

    STM32上实现D3DES加密

    6. **执行D3DES**:首先用第一个密钥执行DES加密,然后用第二个密钥执行DES解密,最后再用第一个密钥进行一次DES加密。这个过程就是D3DES的核心。 7. **密文后处理**:加密完成后,对密文进行逆初始置换,得到最终...

    3DES加密js前端示例

    3DES(Triple Data Encryption Algorithm,三重数据加密算法)是一种强化版的DES(Data Encryption Standard)加密算法,它通过三次应用DES加密过程来提高安全性。在JavaScript中实现3DES加密通常是为了在网络通信中...

    3DES加密java实现

    本篇文章将详细探讨Java环境下如何实现3DES加密算法,并介绍相关知识点。 首先,让我们了解3DES的工作原理。3DES是对原始DES算法的扩展,它通过执行三次加密过程来提高安全性。简而言之,3DES分为两种模式:EDE...

    C# 3DES 加密源码

    - **System.Security.Cryptography.TripleDESCryptoServiceProvider**:这是.NET框架提供的3DES加密服务类,通过实例化它可以获取到3DES加密器对象。 - **CreateEncryptor()** 和 **CreateDecryptor()**:这两个方法...

    3DES加密算法C语言实现

    在C语言中实现3DES加密算法,可以确保在不同平台上的兼容性和一致性,尤其对于需要跨平台操作的应用场景,如将C语言代码移植到Android平台,通过JNI接口与Java代码交互,能够很好地解决加解密结果不一致的问题。...

    3DES加密解密

    标题中的“3DES加密解密”指的是在信息技术领域中,使用三重数据加密标准(3DES,Triple Data Encryption Standard)进行数据加密和解密的过程。3DES是一种加强版的DES加密算法,它通过三次应用DES的加密过程来提高...

    delphi版的3DES加密 pkcs5padding填充

    本篇文章将深入探讨Delphi实现的3DES加密以及PKCS5Padding填充方法。 3DES,全称为三重数据加密标准(Triple Data Encryption Standard),是对原有的DES(Data Encryption Standard)算法的加强版。它通过三次应用...

    Java中3DES加密解密示例(封装byte数组16进制互转)

    Java 中的 3DES 加密解密示例(封装 byte 数组和 16 进制字符串互转) 在 Java 中,3DES 加密是一种常用的加密算法,它可以将明文数据转换为密文数据,以保护数据的安全性。在本示例中,我们将展示如何使用 3DES ...

    DES/3DES加密解密工具

    对数据进行单DES或者3DES加密或者解密,如果密码长度为8字节则为DES加密或者解密

    3des加密的C语言实现

    在C语言中实现3DES加密涉及到一系列的步骤和技术,以下将详细介绍3DES的工作原理、C语言实现的关键点以及相关的编程技巧。 1. **3DES工作原理** - 3DES由三个DES加密过程组成:EDE(加密-解密-加密)。首先,数据...

    3DES加密解密工具类

    3DES加密解密的全工具类,快速帮助新人进行3Des加密解密

    3DES加密算法C++实现

    总的来说,理解和实现3DES加密算法需要对位操作、循环和模式有深入的理解,同时需要关注加密过程中的安全性和效率。C++代码段可以作为一个学习和研究3DES的实用工具,帮助我们更好地理解加密算法的工作原理。

    基于3des加密解密工具

    3DES,全称为三重数据加密标准(Triple Data Encryption Algorithm),是DES加密算法的一种强化版本。DES是一种古老的对称加密算法,由IBM在1970年代初开发,后被美国国家标准局采纳为商业和政府的标准。然而,随着...

    C#3DES加密解密

    本篇文章将深入探讨C#中实现3DES加密解密的方法。 3DES的工作原理是通过三次应用DES算法来提高安全性。它将明文分成64位的数据块,然后用三个不同的密钥进行三次独立的DES加密过程:一次加密、一次解密、再一次加密...

    3des加密 仅能加密英文 和 txt文件

    标题中的“3DES加密”指的是Triple DES(三重数据加密标准),它是一种广泛使用的对称加密算法,基于DES(Data Encryption Standard)并将其安全性增强了三倍。DES原本使用56位密钥,3DES通过三次独立的DES加密过程...

    3DES 加密类 加密

    在C++中实现3DES加密,需要包含相关库,如`&lt;openssl/des.h&gt;`。首先,你需要创建一个3DES上下文环境,设置密钥,然后可以进行加密和解密操作。以下是一个简化的3DES加密过程: ```cpp #include &lt;openssl/des.h&gt; ...

    3des加密解密

    标题 "3DES加密解密" 涉及到的是数据安全领域中的一种常见的对称加密算法——三重DES(Triple DES)。此算法是基于原始的DES(Data Encryption Standard)算法,通过三次加密过程增强了其安全性。以下是关于3DES及其...

    JS端3DES加密JS文件.zip

    通常,服务器会提供一个公钥,客户端使用这个公钥加密3DES的密钥,然后发送给服务器,服务器用私钥解密得到3DES密钥,这样即使在传输过程中密钥被截获,也无法解密数据,因为攻击者没有私钥。 最后,"下载须知 ---...

    3des加密的C语言算法

    3des加密算法的C语言实现,很好很实用

Global site tag (gtag.js) - Google Analytics