`
javazeke
  • 浏览: 86984 次
  • 性别: 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的依据。

分享到:
评论
3 楼 karlmax 2009-11-19  
有一本书好像叫做Java security,里边很多内容,值得一看。
2 楼 javazeke 2009-11-19  
最近在熟悉这些API...希望高手不惜指教
1 楼 Pigwen 2009-11-19  
对称加密作用大,没有对称加密,非对称加密的速度是无法忍受的。。。

相关推荐

    常见加密算法方式(对称加密和非对称加密)

    在实际操作中,经常采用混合加密模式:利用非对称加密算法交换对称加密算法的密钥,再利用对称加密算法加密实际数据,从而结合两种加密算法的优点。 总之,加密算法是信息安全领域的基石,合理选择和使用加密算法...

    对称加密 非对称加密 需要的jar包

    加密主要分为两种类型:对称加密和非对称加密。这两种加密方式各有其特点,适用于不同的场景。 **对称加密** 是一种历史悠久的加密方法,它依赖于一个相同的密钥进行数据的加密和解密。这种加密方式速度快,效率高...

    密码学实验_对称加密算法DES_非对称加密算法RSA.pdf

    本实验报告主要涉及两种加密算法:对称加密算法DES(Data Encryption Standard)和非对称加密算法RSA。实验旨在帮助学生深入理解这两种算法的基本原理,并通过Python编程实现加密和解密过程。 ### **对称加密算法...

    对称密码和非对称密码实现

    在密码学领域,数据安全是至关重要的,而对称密码和非对称密码是两种主要的加密技术,用于保护信息的机密性。本篇将深入探讨这两种密码体制及其在实际应用中的实现,特别是对DES(Data Encryption Standard)对称...

    对称加密非对称加密

    其中,对称加密和非对称加密是两种主要的加密方式,它们各自有着独特的特点和应用场景。本文将深入探讨这两种加密算法及其工作原理。 首先,对称加密是最基础且历史悠久的加密方法。它基于一个秘密的密钥,即加密和...

    对称加密和非对称加密介绍和区别

    - **密钥对**:非对称加密算法需要两个密钥:公开密钥(public key)和私有密钥(private key)。如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;反之亦然。 - **信息交换过程**:甲方生成一对密钥并...

    java编写的加密解密工具,有对称加密和非对称加密

    本工具包就是针对这一需求而设计的,它提供了对称加密和非对称加密两种常见的加密算法,为数据的安全传输和存储提供了保障。 对称加密是最早、最简单的一种加密方式,它的特点是加密和解密使用同一个密钥。在Java中...

    对称密码体制(des&aes加密方法)

    在对称密码体制中,流密码(Stream Ciphers)和分组密码(Block Ciphers)是两种常见的加密方式。流密码是一种实时加密方式, encrypts a digital data stream one bit or one byte at a time。分组密码则将明文分...

    HCSCA115 加密与解密原理.pptx

    加密技术可以分为对称加密和非对称加密两种方式。对称加密使用同一个密钥对数据进行加密和解密,而非对称加密使用不同的密钥对数据进行加密和解密。 对称加密: 对称加密使用同一个密钥对数据进行加密和解密。常见...

    对称与非对称加密

    对称加密和非对称加密各有优势,在实际应用中可以根据不同的场景需求来选择合适的加密方式。对称加密适用于数据量大、实时性强的应用场景;而非对称加密则更适合于密钥分发和身份验证等场景。随着技术的发展,加密...

    C#对称加密和非对称加密的Demo

    本篇将详细介绍这两种加密方式,并结合提供的"RsaEncryptExample"和"TdesEncryptExample"代码示例进行解析。 **1. 对称加密** 对称加密是最常见的加密方法,它使用同一个密钥进行数据的加密和解密。在C#中,`System...

    数据对称与非对称的加解密

    数据加密是保护信息安全的主要手段,主要分为对称加密和非对称加密两种方法。本文将深入探讨这两种加密方式,并结合Mina框架,阐述如何实现它们在数据传输中的应用。 首先,我们来看对称加密。对称加密是最传统的...

    AES对称和RSA非对称加密解密

    在IT领域,加密技术是确保数据安全的重要手段。AES(Advanced Encryption ...在实际应用中,通常会结合使用这两种加密方式,利用RSA来安全地交换AES的密钥,然后用AES进行数据加密,这样既保证了速度,又保证了安全性。

    非对称加密算法

    非对称加密算法的基础理论主要源于数论和抽象代数,其中最著名的两种算法是RSA和ECC(椭圆曲线加密)。RSA是由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出的,它基于大整数因子分解的困难性。ECC则依赖于...

    非对称加密技术详解

    非对称加密技术是一种在现代信息安全领域中占据核心地位的加密方式,相较于传统的对称加密算法,它引入了一种全新的密钥管理机制,即使用一对密钥——公钥和私钥来进行加密和解密操作。这一技术的诞生,解决了信息...

    AES非对称加密(简单易用)

    在加密技术中,对称加密和非对称加密是两种主要类型。对称加密如AES,使用相同的密钥进行加密和解密,效率高但密钥管理困难。而非对称加密,如RSA,使用一对公钥和私钥,一个用于加密,另一个用于解密,安全性更高但...

    vs2008对称和不对称加密解密

    在标题"vs2008对称和不对称加密解密"中,我们关注的是两种主要的加密类型:对称加密和非对称加密(通常称为不对称加密),以及如何在Visual Studio 2008(VS2008)环境中实现这两种加密的解密程序。 对称加密是一种...

    C# 非对称加密

    非对称加密是一种重要的网络安全技术,它在C#编程中被广泛应用,特别是在文件的安全传输和存储方面。非对称加密的核心在于使用一对密钥:公钥和私钥,这两个密钥是数学上关联的,但不能互相推导。这种机制为数据提供...

    非对称加密

    非对称加密是一种重要的密码学技术,它在信息安全领域中起着至关重要的作用。与对称加密不同,非对称加密使用两个密钥:公钥和私钥。这两个密钥在数学上是相互关联的,但不能从一个轻易推导出另一个。这种特性使得非...

    非对称密码

    ELGamal密码是由Taher Elgamal于1985年提出的一种非对称加密算法,其安全性基于离散对数问题。与RSA不同,ELGamal算法更适用于椭圆曲线密码学中的实现,因为椭圆曲线上的离散对数问题被认为比整数域上的离散对数问题...

Global site tag (gtag.js) - Google Analytics