`
XD.zhang
  • 浏览: 11098 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

DES加密与解密

阅读更多

                                                            DES加密与解密

 

 

             随着互联网的发展,信息安全的重要性日益突出,我们需要各种各样的方法对我们的信息进行加密,DES就是大量用于社会中的一种加密和解密方法。

                    DES (Data Entryption Standard) 是一种 对称密码算法(也就是加密密钥和解密密钥相同的加密算法 )可以用于明文的加密和解密 DES这种安全性还算可以加密算法多用于民间,以前常用 ATM机等应用非常广泛。

               DES是以64bit为一个小组来处理所要加密的明文好多用于加密的算法都是以小分组的方式处理数据 的,如MD5是512bit为一个大分组 。用它进行数据加密大体上分为4个步骤:

                              1: 初始置换 函数IP。

                              2: 密钥Ki的获取。           

                              3:密码函数F

                              4:末置换函数IP-1。(是IP的逆置换

                 上面方法涉相应的置换均有相应的对照表可以实现涉及到一些离散数学的知识,如果大家有兴趣搞懂它的话, 具体的方法详可以参考度娘百科,讲的 详细。

                  java一个显著的好处就是将我们要用到的一些功能封装起来,DES加密就可以可以通过我们KeyGenerator、Cipher等类来实现。

 

/**
	 * 根据用户所提供的密钥转换为符合DES加密要求的密钥
	 * @param str
	 */
	public void createKey(String str){
		try {
			KeyGenerator generator = KeyGenerator.getInstance("DES");
			//SecureRandom可以提供安全的随机数(平时我们用的随机数是伪随机数)
			generator.init(new SecureRandom(str.getBytes()));
			key = generator.generateKey();//得到符合要求的密钥
		} catch (NoSuchAlgorithmException e) {//如果没有用户所指定的算法抛出异常
			e.printStackTrace();
		}
	}

                  我们平时用的随机数是有一个周期的可预测的伪随机数发生器产生的,既然可以预测就是不安全的,所以这里要用SecureRamdom来产生随机数。

/**
	 * 加密明文得到密文
	 * @param str
	 * @return 密文
	 */
	public String desEncrypt(String str){
		Cipher cipher;
		try {
			cipher = Cipher.getInstance("DES");
			//用所得到的key初始化这个cipher
			cipher.init(Cipher.ENCRYPT_MODE, key);
			return  bytetohex((cipher.doFinal(str.getBytes())));
		}
		catch(Exception e){
			e.printStackTrace();
		}
		finally{
			cipher = null;
		}
		return null;
	}
	/**
	 * 解密密文输出明文
	 * @param str
	 * @return 明文
	 */
	public String deDesEncrypt(String str){
		Cipher cipher;
		try{
		cipher = Cipher.getInstance("DES");
		cipher.init(Cipher.DECRYPT_MODE, key);
		ciphertext_1 = new String((cipher.doFinal(hextobyte(str.getBytes()))));
		}
		catch(Exception e){
			e.printStackTrace();
		}
		finally {
			cipher = null;
		}
		return ciphertext_1;
	}
 
	//主函数
	public static void main(String [] agrs){
		DesEncrypt_0 encrypt_0 = new DesEncrypt_0();
		encrypt_0.createKey("你好!!");
		ciphertext_0 = encrypt_0.desEncrypt("贫僧从东土大唐而来。。。");
		System.out.println("加密后的结果是:"ciphertext_0);
		ciphertext_1 = encrypt_0.deDesEncrypt(ciphertext_0);
		System.out.println("解密得到的明文是:"ciphertext_1);
	}

                      这样直接运行会报下面的错误,这是因为加密后的byte[]数组是不能随意转换为string类型,为什么在这种情况下byte[]和string是不可逆的。这个我暂时还没搞明白,我想这应该深入研究一下byte和string相互转化的机制 。。。希望有大神来指导一下。。。

 

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher( 输入长度必须是8的倍数时,解密密文) at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
	at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
	at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
	at javax.crypto.Cipher.doFinal(Cipher.java:2086)
	at Test.DesEncrypt_0.deDesEncrypt(DesEncrypt_0.java:62)
	at Test.DesEncrypt_0.main(DesEncrypt_0.java:78)

                将二进制转化为16进制的输出的方法如下:因为我的32bit调用的这个Integer.toHexString()是用32bit存储数据的,所以一个一个byte型的数据和0xff进行了与运算后可以保证它前面的24bit的数据均为0(否则前面24bit会出一些数字干扰我们的结果 ),同时如果调用了toHexString()方法后返回的两个16进制的数字为0Y(Y代表0~E)那么返回的String会自动将0去掉,所以为了避免这种情况的发生,我们要在这里分情况补0.

/**
	 * 二进制转换为十六进制
	 * @param b
	 * @return
	 */
	public String bytetohex(byte [] b){
		String temp="";
		String string="";
		for(int i =0;i<b.length;i++){
			 string = Integer.toHexString(b[i]&0xff);
			 if (string.length() == 1)
				 temp = temp + "0" + string;
				else
					temp+= string;
		}
		return temp;
	}
/**
	 * 将十六进制的数字还原为byte
	 * @param b
	 * @return
	 */
	public byte[] hextobyte(byte[] b){
		byte [] bb = new byte [b.length/2];
		for(int i=0;i<b.length;i+=2){
			//将得到的byte分解为2个byte为一组的string
			String string = new String(b,i,2);
			bb[i/2] = (byte)Integer.parseInt(string,16);
		}
		return bb;
	} 

   最后我们的测试结果见下:         

"加密结果是:"1ca4abf326613caf25e0a684d70cf2c1f233b275fa823aeb075440376a4324ac
"解密得到的明文是:"贫僧从东土大唐而来。。。
 

              DES算法虽然安全性还不错,但随着计算机性能越来越高以及互联网的交互性越来越高,还有本身DES算法的缺陷(密码长度短,只有48bit)穷举攻击破译所花的时间越来越少,逐渐成为可能,所以用到的时候要采用多层DES加密以及衍生了其他建立在该算法基础的其他算法。其实任何加密算法都不是绝对安全的,合理的利用他们才是关键。希望感兴趣的同学看完给我提出一些意见,水平有限,欢迎指正。

 

 

 

分享到:
评论
1 楼 GLC 2012-11-29  
搞信息加密有前途啊。。。真正的靠脑力活赚钱、加油

相关推荐

    DES加密与解密算法

    DES加密与解密算法实现源代码,是我们上课时做的作业

    用C语言实现DES加密与解密.doc

    "用C语言实现DES加密与解密" 本文主要讲解了使用C语言实现DES加密与解密的过程。DES(Data Encryption Standard)是一种对称加密算法,广泛应用于数据加密和解密领域。 首先,文章通过定义了多个数组,例如IP、IP_...

    DES.rar_Des加密解密_des 加密与解密

    这个"DES.rar"压缩包包含了一个用C语言实现的DES加密与解密程序,名为"DES.c",以及一个可能用于动态链接的库文件"libDES.dll"。 DES算法由IBM公司在1970年代初开发,并在1977年被美国国家标准局(NIST)采纳为数据...

    DES 加密与解密算法的实现与应用

    DES加密与解密(初学者)

    DES加密与解密算法的实现

    ### DES加密与解密算法的实现 #### 一、引言 数据加密标准(DES,Data Encryption Standard)是一种广泛应用于信息安全领域的对称加密算法。它由美国国家标准与技术研究院(NIST)在1970年代发布,旨在提供一种...

    QR码DES加密与解密小详解

    ### QR码DES加密与解密小详解 #### 引言 在信息时代,数据安全成为企业和个人关注的焦点。二维码,尤其是QR码,因其信息容量大、可靠性高、支持多种纠错等级以及保密防伪性强等特性,在全球范围内得到了广泛应用。...

    基于Verilog硬件描述的DES加密与解密设计源码

    该项目是一款基于Verilog硬件描述语言的DES加密与解密设计源码,包含共计358个文件,其中包括22个Verilog源代码文件(.v)、22个数据库文件(.dbs)、22个测试文件(.vhd)、1个配置文件(.ini)、1个Python脚本(....

    DES.rar_des 加密与解密

    在本文中,我们将深入探讨DES加密与解密的原理、过程以及其在实际应用中的重要性。 DES是一种块加密算法,它将明文数据分割成64位的数据块,然后使用56位的密钥进行加解密。这里要注意的是,虽然输入的密钥是64位,...

    DesEncrypt.rar_DesEncrypt java_des 加密与解密_desencrypt_java desencr

    标题中的"DesEncrypt.rar_DesEncrypt java_des 加密与解密_desencrypt_java desencr"表明这是一个关于使用Java实现DES加密和解密技术的资源。DES(Data Encryption Standard)是一种广泛使用的对称加密算法,它使用...

    C#.net DES加密与解密程序

    ### C#.NET中的DES加密与解密程序 #### 一、概述 在现代软件开发中,数据的安全性至关重要。为了确保数据在传输过程中的安全,加密技术被广泛应用。本篇文章将详细探讨如何在C#.NET环境中实现数据加密与解密功能,...

    DES加密与解密程序

    DES加密与解密算法的C程序,在main()函数中指定明文、密钥、密文对文件进行加解密,如:DES_Encrypt("f.txt","computer","c.txt")。

    md5、3des加密与解密类,方便

    md5、3des加密与解密 相信对有需要的人是一个很好的帮助

    DES与3DES加密与解密

    基于net的DES与3DES加密数据与解密源码,vb.net 实现。

    C语言实现DES加密解密算法

    DES加密解密算法的C语言实现 DES(Data Encryption Standard)是一种对称密钥 BLOCK 加密算法,使用 56 位密钥对 64 位数据块进行加密。下面是 DES 加密解密算法的 C 语言实现的知识点总结。 字节与二进制转换 在...

    des加密与解密算法.rar

    des加密与解密算法.rar..................

    只有DES加密与解密的DES.cpp

    采用简易CBC模式,简单的c++语句实现DES加密与解密,清晰易懂,结合DES的有关详解食用更加

Global site tag (gtag.js) - Google Analytics