`
javazeke
  • 浏览: 85467 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

对称加密的两种方式

阅读更多

对称加密,这东东现在已经没啥用了,但据说可以帮助我了解加密思想,我还是把它弄出来了

新手心情好的话就看看吧

 

首先一个帮助类,找地址的

package zeke.security;

//路径的控制
public class PathUtil {
	

	public static String getPath() {

		String path = PathUtil.class.getResource("/").getPath();
		
		path=path.substring(1, path.length());

		return path;
	}

	

}

 

加密解密类,有两个,一个是依据系统自带算法生成key,还有一个是可以自己输入密码生成key

 

依据系统自带算法生成key

package zeke.security;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

/**
 * 对称加密密钥的生成,获取
 * 
 * @author Administrator
 */
public class SymmetricCipherWithKey {

	public static void createKey(String keyName) {

		try {

			/**
			 * Key generators for generating keys suitable for the DES, Triple
			 * DES, Blowfish, HMAC-MD5, and HMAC-SHA1 algorithms.
			 * 大概的意思可以用这些算法生成keyGenerator实例
			 */
			KeyGenerator key = KeyGenerator.getInstance("DES");

			// 初始化key;如果客户端没有显式地初始化 KeyGenerator(通过调用 init 方法)
			// ,每个提供程序必须提供(和记录)默认初始化。
			// DES-56位
			// Blowfish-32~448位
			// HMAC-MD5, and HMAC-SHA1-64位
			key.init(56);

			// 获得密钥

			SecretKey sk = key.generateKey();

			saveObject(sk, PathUtil.getPath() + "/" + keyName);

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 序列化
	 * @param obj
	 * @param fileURL
	 */
	public static void saveObject(Object obj, String fileURL) {

		try {

			FileOutputStream os = new FileOutputStream(fileURL);

			ObjectOutput oos = new ObjectOutputStream(os);

			oos.writeObject(obj);

			oos.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	// 从序列化对象中获得key对象
	public static SecretKey getKey(String keyName) {

		return (SecretKey) readerObject(PathUtil.getPath() + "/" + keyName);

	}
	
	/**
	 *反 序列化
	 * @param fileURL
	 * @return
	 */
	public static Object readerObject(String fileURL) {

		Object obj = null;

		try {

			FileInputStream fis = new FileInputStream(fileURL);

			ObjectInputStream is = new ObjectInputStream(fis);

			obj = is.readObject();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return obj;
	}

	// 对给定文本加密
	public static byte[] enCipherContent(String content, String keyName) {

		byte[] b = null;

		try {

			Cipher cipher = Cipher.getInstance("DES");

			cipher.init(Cipher.ENCRYPT_MODE, getKey(keyName));

			b = cipher.doFinal(content.getBytes());

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}

		return b;
	}

	// 解密
	public static String deCipherContent(byte[] b, String keyName) {

		String str = null;

		try {

			Cipher cipher = Cipher.getInstance("DES");

			cipher.init(Cipher.DECRYPT_MODE, getKey(keyName));

			str = new String(cipher.doFinal(b));

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}

		return str;
	}

}

 

自己输入密码生成key

package zeke.security;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

/**
 * 对称加密密钥的生成,获取
 * 
 * @author Administrator
 */
public class SymmetricCipherWithPassword {

	public static SecretKey createPassword(String password) {
		
		String pass=password;
		//需要判断pass长度,并需要长度大于8
		if(pass.length()<8){
			pass+="abcdefghijklmn";
		}

		SecretKey sk=null;
		try {

			
			DESKeySpec desKeySpec=new DESKeySpec(pass.getBytes());
			
			SecretKeyFactory skf=SecretKeyFactory.getInstance("DES");
			
			sk=skf.generateSecret(desKeySpec);
			
			
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		}
		return sk;
	}
	
	/**
	 * 序列化
	 * @param obj
	 * @param fileURL
	 */
	public static void saveObject(Object obj, String fileURL) {

		try {

			FileOutputStream os = new FileOutputStream(fileURL);

			ObjectOutput oos = new ObjectOutputStream(os);

			oos.writeObject(obj);

			oos.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	
	/**
	 *反 序列化
	 * @param fileURL
	 * @return
	 */
	public static Object readerObject(String fileURL) {

		Object obj = null;

		try {

			FileInputStream fis = new FileInputStream(fileURL);

			ObjectInputStream is = new ObjectInputStream(fis);

			obj = is.readObject();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return obj;
	}

	// 对给定文本加密
	public static byte[] enCipherContent(String content, SecretKey key) {

		byte[] b = null;

		try {

			Cipher cipher = Cipher.getInstance("DES");

			cipher.init(Cipher.ENCRYPT_MODE,key );

			b = cipher.doFinal(content.getBytes());

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}

		return b;
	}

	// 解密
	public static String deCipherContent(byte[] b, SecretKey key) {

		String str = null;

		try {

			Cipher cipher = Cipher.getInstance("DES");

			cipher.init(Cipher.DECRYPT_MODE, key);

			str = new String(cipher.doFinal(b));

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}

		return str;
	}

}

 

 

 

测试类

package zeke.security;

public class Test {
	
	public static void main(String[] args) {
		
		/*
		//................................带文件key......................................................
		
		//生成key文件
		//SymmetricCipherKey.createKey("key");
		
		//加密获得加密后的文本
		byte[] b=SymmetricCipherWithKey.enCipherContent("I like youfdf合法安家费哈斯勒", "key");
		//序列化加密文件
		SymmetricCipherWithKey.saveObject(b, PathUtil.getPath()+"/jiami.txt");
		
		//System.out.println(new String(b));
		//解密
		byte[] s=(byte[]) SymmetricCipherWithKey.readerObject(PathUtil.getPath()+"/jiami.txt");
		String str=SymmetricCipherWithKey.deCipherContent(s, "key");
		
		System.out.println(str);
		
		*/
		
		//.........................................口令.....................................................
		
		byte[] bs=SymmetricCipherWithPassword.enCipherContent("dsadadassault斤斤计较", SymmetricCipherWithPassword.createPassword("11"));
		
		String bsde=SymmetricCipherWithPassword.deCipherContent(bs, SymmetricCipherWithPassword.createPassword("11"));
		
		System.out.println(new String(bsde));
	}

}

 

 

后面还有对流进行加密,什么的,有时间也把他们封装出来。上面两个对于算法,我都是用的"DES“还有其他的,只要你再生产key和加密解密对象时重新指定就可以了,就是换个算法去算他们生成key的依据。

分享到:
评论
23 楼 myreligion 2010-03-02  
别用DES那个废品,56位加密技术,速度又慢又不可靠,现在早破解了。对称加密应该用AES。128位直接免费使用,256位从sun下个补丁免费使用,比DES靠谱多了。
22 楼 snowolf 2010-03-02  
Pigwen 写道
对称加密作用大,没有对称加密,非对称加密的速度是无法忍受的。。。

离开了对称加密算法,非对称加密算法就是空谈!非对称加密算法中用于真正加密的算法仍是对称加密算法!LZ要反复理解DH算法的来龙去脉! Java加密技术(一)
21 楼 hcqenjoy 2009-11-23  
grandboy 写道
jnoee 写道
有本红皮书,好早以前看过的,是不是叫Java Security?很不错。
楼主该了解一下基础知识。


我有这本书,需要的话,可以借给你。 


O'Reilly Java Security, 2nd.pdf 是这个吧 google之
20 楼 javaxiang 2009-11-23  
patrickyao1988 写道
grandboy 写道
jnoee 写道
有本红皮书,好早以前看过的,是不是叫Java Security?很不错。
楼主该了解一下基础知识。


我有这本书,需要的话,可以借给你。 

是PDF的吗。。。。我也要。。

传个我吧
19 楼 hcqenjoy 2009-11-23  
对称加解密 非对称加解密 数字摘要 这三大块 一般的解决方案都是三者结合应用
18 楼 javazeke 2009-11-22  
O(∩_∩)O哈哈~
17 楼 linhong_1001 2009-11-22  
javazeke 写道
哈哈,技术牛X,就一定能搞到money吗?不过说的也是,我刚刚学习加密这些东西,还是谦虚的好。。。谢了


看来你已经much money 了
16 楼 javazeke 2009-11-21  
哈哈,技术牛X,就一定能搞到money吗?不过说的也是,我刚刚学习加密这些东西,还是谦虚的好。。。谢了
15 楼 wangzaixiang 2009-11-21  
对称加密,这东东现在已经没啥用了,但据说可以帮助我了解加密思想,我还是把它弄出来了

新手心情好的话就看看吧

嗯,这个水平的认识,你不用学计算机了。没前途的。还蛮有成就感,给新手学习。
14 楼 patrickyao1988 2009-11-20  
grandboy 写道
jnoee 写道
有本红皮书,好早以前看过的,是不是叫Java Security?很不错。
楼主该了解一下基础知识。


我有这本书,需要的话,可以借给你。 

是PDF的吗。。。。我也要。。
13 楼 zeeeitch 2009-11-20  
rsa des是算法

ssl
pgp
Kerberos是应用协议

根据需要,协议中会分别使用对称,非对称
12 楼 javazeke 2009-11-20  
grandboy 写道
jnoee 写道
有本红皮书,好早以前看过的,是不是叫Java Security?很不错。
楼主该了解一下基础知识。


我有这本书,需要的话,可以借给你。 


那的感谢啦,,是英文版的吗,英文版的看的太慢,英语不眨的啊。。。。
11 楼 grandboy 2009-11-20  
jnoee 写道
有本红皮书,好早以前看过的,是不是叫Java Security?很不错。
楼主该了解一下基础知识。


我有这本书,需要的话,可以借给你。 
10 楼 linhong_1001 2009-11-20  
SSL就是这样的啊
9 楼 whaosoft 2009-11-20  
非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要,但加密和解密花费时间长、速度慢,它不适合于对文件加密而只适用于对少量数据进行加密
8 楼 lpzp123 2009-11-20  
Pigwen 写道
对称加密作用大,没有对称加密,非对称加密的速度是无法忍受的。。。

确实是这样的,一般在数据在网络传输过程中,用非对称加密算法去加密对称加密的密匙,然后非对称解密后再用对称加密的密匙去加密要传输的数据。
7 楼 imlsq 2009-11-20  
对称加密的应用场合比非对称加密广泛

非对称加密慢得像只乌龟。

经典的应用场景是这样:

先用密钥 对 明文 进行对称加密

再用非对称算法加密 对称加密的 “密钥” , 从而达到 安全可靠,不可篡改的要求
6 楼 jonahliu 2009-11-20  
不可忽视对称加密,在某些特定的场合,对称加密还是优于非对称加密的。
比如说内网系统间,或是安全性要求不高的系统。
很多时候,都是非对称加密结合对称加密的。使用非对称加密方式传输对称加密的密钥,之后就采用对称加密的方式。
5 楼 jnoee 2009-11-20  
有本红皮书,好早以前看过的,是不是叫Java Security?很不错。
楼主该了解一下基础知识。
4 楼 cesc 2009-11-19  
<div class="quote_title">Pigwen 写道</div>
<div class="quote_div">对称加密作用大,没有对称加密,非对称加密的速度是无法忍受的。。。</div>
<p> </p>
<p> 是啊,web中就是第一次交互使用非对称加密,后面都是对称加密。</p>

相关推荐

    qt5AES加密,ES加密/解密算法是一种可逆的对称加密算法,这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推

    qt5AES加密,ES加密/解密算法是一种可逆的对称加密算法,这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推

    java非对称加密demo(秘钥文件\字符秘钥)

    自己整理的非对称加密demo,包含生成秘钥文件、生成字符转秘钥两种方式。

    DES.rar_对称密码算法_流数据加密

    对称密钥算法又分为两种分组密码和流密码。分组密码将明文分割为若干个定长的数据块称为一个分组, 每次对一个分组进行处理流密码又称序列密码, 依次对输人每个元素进行处理。DES算法是一种最通用的对称密钥算法, ...

    java加解密

    java加密解密工具类,里面有对称加密和非对称加密两种方式,另附调用方式

    SM4国产对称加密算法(delphi),兼容java

    SM4(国产对称加密算法) ,支持ECB和CBC两种加密模式,支持base64和HEX两种加密格式输出。兼容java

    Spring Cloud Config配置文件使用对称加密的方法

    Spring Cloud Config提供了两种加密解密方式,一种是对称加密,一种是非对称加密。这篇文章将先展示如何使用对称加密。感兴趣的朋友跟随脚步之家小编一起学习吧

    xml加密解密工具XMLEncryption

    xml加密(XML Encryption)是w3c加密xml的标准。...不管xml加密是如何完成的,保存加密数据总是用两种方法之一。 1、加密后所有的元素都被命名为 2、加密后只有数据被替换,而元素名称仍然是可读的,不会发生变化。

    ASE算法密码学课程设计

    对称密钥算法又分为两种分组密码和流密码。分组密码将明文分割为若干个定长的数据块称为一个分组, 每次对一个分组进行处理流密码又称序列密码, 依次对输人每个元素进行处理。DES算法是一种最通用的对称密钥算法, ...

    智能卡的非对称加密算法

    在1976年,Witfield Dime和Martin E·HeBman描述了发展一种立足于两个不同的密钥的加密算法的可能性[Diffie 16]。这些密钥中的一个是公开的,另一个是秘密的或“私有的”。这将有可能使某个人用公开密钥去加密一...

    对称加密算法RC5的架构设计与电路实现

    对RC5对称加密算法的Feistel结构加解密内核电路实现架构展开了研究.在对已有的 Feistel流水线设计方法分析的基础上,提出了具有不同结构特点的RC5算法Feistel流水线实现 方案,并分析...

    Alfonsxh#Blog#6-混合密码系统1

    混合密码系统混合密码系统(hybird cryptosystem)结合了对称密码和非对称密码两种加密方式各自的优势,使用对称密码对数据的明文进行加密,使用非对称

    利用DNA技术的非对称加密和签名方法

    结合基因工程技术和密码学技术,提出了一种非对称加密和签名密码系统DNA-PKC。 这是对生物密码学的探索性研究。 与传统的公共密钥密码学类似,DNA-PKC使用两对密钥分别进行加密和签名。 使用公共加密密钥,每个人都...

    DES密码学课程设计

    对称密钥算法又分为两种分组密码和流密码。分组密码将明文分割为若干个定长的数据块称为一个分组, 每次对一个分组进行处理流密码又称序列密码, 依次对输人每个元素进行处理。DES算法是一种最通用的对称密钥算法, ...

    网络安全原理与应用:非对称加密算法.pptx

    与只使用单一密钥的对称加密算法相比,它在加解密时,分别使用了两个不同的密钥: 一个可对外界公开,称为“公钥”; 一个只有所有者知道,称为“私钥”。 用公钥加密的信息只能用相应的私钥解密,反之亦然。 同时,...

    用椭圆曲线作为非对称加密算法

    除了RSA和DSA这两种著名的非对称加密算法之外,在智能卡领域还有第3种类型的加密方法被用于数字签名和密钥交换,它是基于椭圆曲线EC(Elliptic Curves)的。  1985年,Victor Miller和Neal Koblitz各自独立地提出...

    aes.js AES加密js文件

    AES分为ECB和CBC两种方式。 CBC模式比ECB模式安全。 ECB模式比CBC模式快。 AES对称加密,比DES安全性高。 AES通常用于移动通信系统加密以及基于SSH协议的软件。 AES对称加密:AES常用的有ECB和CBC两种模式。常用的...

    非对称椭圆加密算法(ECC)真正delphi代码实现

    椭圆加密算法(ECC)是一种公钥加密体制,最初由Koblitz和Miller两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。与经典的RSA,DSA等公钥密码体制相比,椭圆密码...

    vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)

    主要介绍了vue项目中使用AES实现密码加密解密的方法,主要是通过ecb和cbc两种模式,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    黄淮学院\考试题\2010-2011

    A、加密包括对称加密和非对称加密两种 B、信息隐藏是加密的一种方法 C、如果没有信息加密的密钥,只要知道加密程序的细节就可以对信息进行加密 D、密钥的位数越多,信息的安全性就越高 可以认为数据的加密和解密是...

    Android数据加密之Rsa加密

    最近无意中和同事交流数据安全传输的问题,想起自己曾经使用过的Rsa非对称加密算法,闲下来总结一下。  其他几种加密方式:  •Android数据加密之Rsa加密  •Android数据加密之Aes加密  •Android数据加密之...

Global site tag (gtag.js) - Google Analytics