`

3des的加解密过程

阅读更多
请看代码,这是3Des最简单的加解密过程:
/**
 * <pre>
 * Title: 		OaKeyHandle.java
 * Project: 	taxs_Portal
 * Type:		com.tenpay.taxs.web.util.OaKeyHandle
 * Author:		ben.liu
 * Create:	 	May 15, 2008 11:41:09 AM
 * Copyright: 	Copyright (c) 2008
 * Company:		
 * <pre>
 */


/**
 * <pre>
 * 用户登录解密
 * </pre>
 * 
 * @author ben.liu
 * @version 1.0, May 15, 2008
 */

import java.security.SecureRandom;
import java.security.spec.KeySpec;

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

public class OaKeyHandle
{

	// DES3 解密
	public static String decryptEde(String key, String src) // throws
															// DecryptException
	{
		String plainText = null;
		try
		{
			byte[] keyBytes = new byte[24]; // DES3 为24Bytes密钥
			asciiToBcdBytes(key, keyBytes, Math.min(32, key.length()) / 2);

			for (int i = 0; i < 8; ++i)
				keyBytes[16 + i] = keyBytes[i];

			// 从原始密匙数据创建一个DESKeySpec对象
			KeySpec dks = new DESedeKeySpec(keyBytes);

			// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
			// 一个SecretKey对象
			SecretKey secKey = SecretKeyFactory.getInstance("DESede").generateSecret(dks);

			// Cipher对象实际完成解密操作
			Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");

			// DES算法要求有一个可信任的随机数源
			SecureRandom sr = new SecureRandom();

			// 用密匙初始化Cipher对象
			cipher.init(Cipher.DECRYPT_MODE, secKey, sr);

			int count = (src.length() + 1) / 2;
			byte[] inputBytes = new byte[count];
			asciiToBcdBytes(src, inputBytes, count);

			// 正式执行解密操作
			byte[] decryptBytes = cipher.doFinal(inputBytes);

			int olen = decryptBytes.length - 1;
			for (; decryptBytes[olen] == 0 && olen >= 0; --olen)
			{
			}

			plainText = new String(decryptBytes, 0, olen + 1);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

		return plainText;
	}

	private static void asciiToBcdBytes(String str, byte[] hex, int count)// throws
																			// Exception
	{
		byte[] inputBytes = str.getBytes();
		for (int i = 0, j = 0; j < inputBytes.length && i < count; ++i)
		{
			byte v = inputBytes[j];
			++j;
			if (v <= 0x39)
				hex[i] = (byte) (v - 0x30);
			else
				hex[i] = (byte) (v - 0x41 + 10);

			hex[i] <<= 4;

			if (j >= inputBytes.length)
				break;

			v = inputBytes[j];
			++j;

			if (v <= 0x39)
				hex[i] += (byte) (v - 0x30);
			else
				hex[i] += (byte) (v - 0x41 + 10);
		}
	}

	/**
	 * 加密
	 * */
	public static String encryptEde(String key, String src)// throws
															// DecryptException
	{
		String plainText = null;
		try
		{
			byte[] keyBytes = new byte[24]; // DES3 为24Bytes密钥
			asciiToBcdBytes(key, keyBytes, Math.min(32, key.length()) / 2);

			for (int i = 0; i < 8; ++i)
				keyBytes[16 + i] = keyBytes[i];

			// 从原始密匙数据创建一个DESKeySpec对象
			KeySpec dks = new DESedeKeySpec(keyBytes);

			// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
			// 一个SecretKey对象
			SecretKey secKey = SecretKeyFactory.getInstance("DESede").generateSecret(dks);

			// Cipher对象实际完成解密操作
			Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");

			// DES算法要求有一个可信任的随机数源
			SecureRandom sr = new SecureRandom();

			// 用密匙初始化Cipher对象
			cipher.init(Cipher.ENCRYPT_MODE, secKey, sr);

			byte[] srcBytes = src.getBytes("GBK");
			int srcLen = srcBytes.length;
			int encLen = ((srcLen % 8) == 0) ? srcLen : ((srcLen / 8 + 1) * 8);

			byte[] encBytes = new byte[encLen];
			System.arraycopy(srcBytes, 0, encBytes, 0, srcLen);

			// 正式执行解密操作
			byte[] encryptBytes = cipher.doFinal(encBytes);
			plainText = bcdBytesToAscii(encryptBytes, encLen);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

		return plainText;
	}

	private static String bcdBytesToAscii(byte[] hex, int count)// throws
																// Exception
	{
		byte[] ascii = new byte[2 * count];
		int t;
		for (int i = 0; i < count; i++)
		{
			t = hex[i] & 0xf0;
			t = t >> 4;
			if (t <= 9)
				t += '0';
			else if (t >= 10 && t <= 15)
				t += 'A' - 10;
			else
				t = '0';
			ascii[2 * i] = (byte) t;

			t = hex[i] & 0x0f;
			if (t <= 9)
				t += '0';
			else if (t >= 10 && t <= 15)
				t += 'A' - 10;
			else
				t = '0';
			ascii[2 * i + 1] = (byte) t;
		}

		return (new String(ascii));
	}

	/**
	 * 解密商户系统登录用户信息
	 */
	public static String[] onProcess(String passport, String key)
	{
		// 获取来自oa的请求信息
		String loginParam = passport;
		if (null == loginParam)
		{
			return null;
		}
		// 解密来自oa的用户信息
		String[] usrInfo = decryptEde(key, loginParam).split("&");
		if (usrInfo.length < 3)
		{
			return null;
		}
		return usrInfo;
	}
}
分享到:
评论

相关推荐

    3DES加密解密工具

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

    3DES加密解密

    描述中提到的"加出来和你文档上的不一样我负责"可能是指提供的代码实现与文档中描述的3DES加密解密方法可能存在差异,但开发者对此负责,意味着他们对代码的正确性和可靠性有信心。"DES3encrypt"和"DES3decrypt"是...

    visual c++ VC实现3DES加解密 加密解密.zip

    本项目是使用Visual C++实现3DES加解密功能的一个实例,下面将详细介绍3DES算法及其在Visual C++中的实现。 3DES,全称为三重DES,是对DES(Data Encryption Standard)的加强版。DES是一种块密码,采用64位的数据...

    3des加密解密

    标题 "3DES加密解密" 涉及到的是数据安全领域中的一种...在Java开发中,可以通过Bouncy Castle这样的加密库实现3DES的加解密操作。提供的文件可能包含3DES算法的Java实现代码,可以进一步研究学习其工作原理和应用。

    易语言3DES加解密源码

    源码并没有写出3DES加解密过程,而是用java写的, 将java打包成jar包提供给易语言调用。至于这个东西有什么用? 方便web交互数据,php java都是支持的。 @zhao6810。

    des 3des 加密 解密

    `3des加解密.c`可能是主程序,它调用了`d3des.cpp`中定义的函数,而`d3des.h`可能包含了加密解密函数的声明。通过阅读和理解这些代码,可以学习到如何在实际项目中应用DES和3DES。 总的来说,DES和3DES是密码学中的...

    3DES加密解密java版+js版

    3. **解密过程**: - Java中,同样使用`Cipher`类,但这次设置为解密模式(如`Cipher.DECRYPT_MODE`),然后调用`doFinal`解密加密后的数据。 - JavaScript中,使用`Crypto.subtle.decrypt`方法进行解密。 4. **...

    des加密解密_Des加密解密_DES加密_

    4. **加解密过程**:DES的加密和解密过程非常相似,只是在某些步骤中使用了相反的操作。解密时,只需将加密过程中的子密钥顺序反转,并应用相反的非线性函数。 在给定的“des加密例程”中,可能包含了一个调用动态...

    MFC实现DES加密解密实现

    4. **逆过程**:解密过程与加密过程基本相反,使用逆初始置换(IP^-1),逆S盒和逆P盒,以及相同的子密钥,只是应用顺序相反。 在MFC中,你可以创建一个名为`DES`的类,包含`Encrypt`和`Decrypt`方法。这些方法将...

    RSA加密和3DES加解密

    RSA加密和3DES加解密是两种常见的对称与非对称加密算法,在信息安全领域有着广泛应用。在JAVA环境中,这两种加密技术提供了数据保护的重要手段,确保了敏感信息在网络传输过程中的安全。 首先,RSA(Rivest-Shamir-...

    DES加解密(JS端加解密)

    在JavaScript环境中,DES加解密可以用于保护敏感数据,如用户密码、API密钥等,确保在网络传输中数据的安全性。 在JavaScript中实现DES加解密,通常需要借助库,如`crypto-js`。这个库提供了多种加密算法,包括DES...

    des加密解密源代码

    DES加密解密过程,C++实现

    基于3des加密解密工具

    3DES的过程包括三个阶段:加密-解密-加密(EDE)或解密-加密-解密(DEC),这取决于密钥的配置。 1. **加密-解密-加密(EDE)模式**: - 第一次加密:使用第一个密钥K1对明文进行DES加密,得到中间密文C1。 - 第...

    3des加解密算法C语言代码

    在C语言中实现3DES加解密,需要理解DES的S盒(Substitution Box)、P盒(Permutation Box)以及F函数等核心概念。同时,需要实现将64位的输入数据块按照DES规则进行处理的函数,包括初始置换、扩展置换、异或操作、8...

    C#实现DES加解密完整类源码

    下面我们将详细讨论C#实现DES加解密的相关知识点。 1. **基本概念**: - **对称加密**:加密和解密使用同一密钥。 - **DES算法**:基于Feistel结构,通过多次迭代实现数据的加密和解密。 - **密钥长度**:DES的...

    3DES加密解密算法

    解密过程与加密类似,但在`decryptMode`方法中,`Cipher`实例初始化为解密模式(Cipher.DECRYPT_MODE),并使用同样的密钥对加密后的数据进行解密。 3DES算法的安全性在于其使用了三个不同的56位DES密钥(总共168位...

    des加密解密工具

    这款工具的优点在于用户可以本地运行,避免了在线加解密可能带来的密钥泄露风险,确保了数据安全性。用户只需要输入相应的密钥和待处理的数据,工具就能完成加密或解密过程。对于需要保护敏感信息的个人或企业来说,...

    用 MFC 实现 DES 加密解密算法

    在实现DES加密解密的过程中,首先需要理解DES的基本步骤,包括初始置换、扩展置换、8轮Feistel网络、逆扩展置换和逆初始置换。在MFC环境中,这些步骤可以通过定义类和函数来实现。例如,可以创建一个名为`CDES`的类...

Global site tag (gtag.js) - Google Analytics