`

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加解密过程,而是用java写的, 将java打包成jar包提供给易语言调用。至于这个东西有什么用? 方便web交互数据,php java都是支持的。 @zhao6810。

    des加密解密源代码

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

    MFC编写的DES加解密程序

    利用MFC编写的DES加解密程序,可以输入一个文件(最好不要超过1M,否则加密速度比较慢),再输入8位密码(超过8位按8位算),实行加密或解密,并且能够计算加密解密所用的时间

    DES加解密C语言版

    DES加解密的C语言实现,并且以txt文档的形式输出所有加解密过程,方便查看

    3DES加密解密的实现.

    3DES加密解密的实现. 详解了3DES加密及解密的过程原理及应用

    MFC实现DES加密解密实现

    用VC实现文件的DES加密解密,其中包括算法的详细过程

    带界面的DES加密解密java源码

    带界面的DES加密解密java源码,可以实现加密解密和显示每一步的过程。

    QT做的DES加解密实例

    之前在CSDN下载了个DES例子,在调试的过程中发现有个BUG,就重新找资源更改了下,上传出来供参考,所参考的资源参考文件中readme

    DES加密解密工具类

    DES加密解密工具类及使用DEMO,可以用于用户信息传输过程加密等

    DES加解密过程和实现.doc

    DES加解密过程和实现.doc

    gcc_Des_3Des加密解密算法

    在linux/unix平台上实现的des,3des加密解密算法。在main.c中提供了实例程序,你可以运行他来知道如何使用该加密解密过程。

    网络安全课程设计,DES实现通信过程中的加密解密

    DES 的加密解密,容易理解,可以运行,很好的课程设计哦

    des加密解密的实现

    本文是一篇讨论关于常用文件加密解密算法的毕业设计论文,它详细的讲述了文件加密解密算法实现的过程中所用到的方法、技术。对公钥密码体制和私钥密码体制进行了分析和研究,并对公钥密码体制和私钥密码体制的代表...

    DES加密解密实现

    本程序实现了DES的加密解密过程。对密码学实验的的同学会有帮助

    des加密解密代码示例

    des加密解密工具类的详细代码demo,现在的网络应用无处不存在着安全隐患,人们在使用的过程中对个人数据的保密性也越来越重视,一个简单的des加解密供大家参考,让你的程序多一层安全保障。

    银联3DES加密解密JAR

    不解释,所有过程本人封装成jar包,导入项目直接调用DES3encrypt(传明文)加密 DES3decrypt(传密文) 解密

    DES加密解密

    随着信息技术的快速发展,网络成为了人们生活中不可缺少的一部分,网络安全问题也渐入人们视线。...本文将对DES (Data Encryption Standard) 数据加密标准进行如何加密以及如何解密进行详细的介绍。

    3DES加密算法源码

    而解密则为其反过程: 平文 = DK1(EK2(DK3(密文))) 即以K3解密,以K2“加密”,最后以K1解密。 每次加密操作都只处理64位数据,称为一块。 无论是加密还是解密,中间一步都是前后两步的逆。这种做法提高了使用密钥...

    SM4 国密4 DES 3DES 加解密 异或 MAC运算 模拟密码键盘

    源码交流 请下载资源里面联系方式 这里面有des 3des的加解密,以及银联ANSI9.9mac运算,异或运算,模拟银行密码键盘加密过程,支持有账号和无账号类型。

    DES加密解密matlab实现.rar_DES Encryption_DES 加密_fence4ld_matlab des_ma

    使用matlab实现DES加密解密过程,对初学DES算法者有一定帮助。

Global site tag (gtag.js) - Google Analytics