`

java安全-对称/非对称的加密和解密(付源代码)

    博客分类:
  • java
阅读更多
对称加密/解密
密和解密使用相同的密钥,有代表性的有DES、Blowfish、TEA、Base64。对称加密解密的特点是运算相对非对称加密解密简单、速度块,主要应用于需要加密大量数据的场合,例如游戏的资源文件加密。

非对称加密/解密。
加密和解密使用不同的密钥(公钥/私钥),有代表性的有RSA、DSA、ElGamal和ECDSA。非对称加密/解密的安全性是基于复杂数学难题,特点是运算复杂、速度慢,主要应用于金融、军事等重大机密的系统。

代码演示:
package com.naxsu.security;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;

import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

/**
 * 对称/非对称加密与解密
 */
public class SecretKeyTest {
	public static void main(String[] args) throws Exception {
//		 secretEncrypt();
//		 secretDecrypt();

//		 secretEncryptByPass();
//		 secretDecryptByPass();

		publicEncrypt();
		privateDecrypt();
	}
	
	/**
	 * 对称加密,随机产生密钥
	 * @throws Exception
	 */
	private static void secretEncrypt() throws Exception {
		// Cipher:为加密和解密提供密码功能
		Cipher cipher = Cipher.getInstance("AES");
		// 生成密钥
		SecretKey key = KeyGenerator.getInstance("AES").generateKey();

		/*
		 * 小知识: 由于key是一个对象,要把它写到文件中,所在要用ObjectOutputStream.writeObject()
		 * 要用这个方法,这个类必须实现Serializable接口进行持久化进行对象保存,Object-->硬盘-->Object
		 */

		// 把密钥保存到secret.key文件中
		saveKey(key, "secret.key");
		// 根据密钥把cipher初始化为加密模式
		cipher.init(Cipher.ENCRYPT_MODE, key);
		// cipher.update("aaa".getBytes());
		// cipher.update("aaa".getBytes());
		// byte[] results = cipher.doFinal();

		// 对aaa进行加密操作
		byte[] results = cipher.doFinal("aaa".getBytes());
		System.out.println(new String(results));

		// 把加密后的字符串存放到data.txt中
		saveData(results, "data.txt");
	}

	/**
	 * 对称解密,读取存放密钥的文件获取密钥,然后根据密钥来解密
	 * @throws Exception
	 */
	private static void secretDecrypt() throws Exception {
		Cipher cipher = Cipher.getInstance("AES");
		// 读取存放密钥的secret.key文件
		Key key = readKey("secret.key");
		// 根据密钥把cipher初始化为解密模式
		cipher.init(Cipher.DECRYPT_MODE, key);
		// 读取data.txt文件,获取要解密的内容
		byte[] src = readData("data.txt");
		// 解密
		byte[] result = cipher.doFinal(src);
		System.out.println(new String(result));
	}

	/**
	 * 根据密码进行对称加密
	 * @throws Exception
	 */
	private static void secretEncryptByPass() throws Exception {
		Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
		SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES")
				.generateSecret(new PBEKeySpec("12345678".toCharArray()));
		PBEParameterSpec parameterSpec = new PBEParameterSpec(new byte[] { 1,
				2, 3, 4, 5, 6, 7, 8 }, 1000);
		cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);

		byte[] results = cipher.doFinal("aaa".getBytes());
		System.out.println(new String(results));

		saveData(results,"data.txt");
	}

	/**
	 * 根据密码进行对称解密
	 * @throws Exception
	 */
	private static void secretDecryptByPass() throws Exception {
		Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
		SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES")
				.generateSecret(new PBEKeySpec("12345678".toCharArray()));
		PBEParameterSpec parameterSpec = new PBEParameterSpec(new byte[] { 1,
				2, 3, 4, 5, 6, 7, 8 }, 1000);
		cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);

		byte[] src = readData("data.txt");

		// 解密
		byte[] result = cipher.doFinal(src);
		System.out.println(new String(result));
	}

	/**
	 * 根据公钥进行非对称加密
	 * @throws Exception
	 */
	private static void publicEncrypt() throws Exception {
		Cipher cipher = Cipher.getInstance("RSA");
		KeyPairGenerator kPairGenerator = KeyPairGenerator.getInstance("RSA");
		KeyPair keyPair = kPairGenerator.generateKeyPair();
		Key publicKey = keyPair.getPublic();
		Key privateKey = keyPair.getPrivate();
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		byte[] result = cipher.doFinal("那些事儿".getBytes("UTF-8"));

		saveKey(privateKey, "secret2.key");
		saveData(result, "data2.txt");
	}

	/**
	 * 根据私钥进行非对称解密
	 * @throws Exception
	 */
	private static void privateDecrypt() throws Exception{
		Cipher cipher = Cipher.getInstance("RSA");
		Key privateKey = readKey("secret2.key");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		
		//方法1:
//		byte[] src = readData("data2.txt");
//		byte[] result=cipher.doFinal(src);
//		System.err.println(new String(result,"UTF-8"));
		
		//方法2:
//		FileInputStream fis = new FileInputStream("data2.txt");
//		CipherInputStream cis = new CipherInputStream(fis, cipher);
//		//简单处理一下
//		byte[] buf = new byte[1024];
//		int len = cis.read(buf);
//		System.out.println(new String(buf,0,len,"UTF-8"));
		
		//方法3:
		FileInputStream fis = new FileInputStream("data2.txt");
		FileOutputStream fos = new FileOutputStream("result.txt");
		CipherOutputStream cos = new CipherOutputStream(fos, cipher);
		copyStream(fis, cos);
		cos.close();
		fos.close();
		fis.close();
	}

	/**
	 * 把输入流拷贝到输出流
	 * @param is
	 * @param os
	 * @throws IOException
	 */
	private static void copyStream(InputStream is, OutputStream os)
			throws IOException {
		byte[] buf = new byte[1024];
		int len = is.read(buf);
		while (len != -1) {
			os.write(buf, 0, len);
			len = is.read(buf);
		}
	}

	/**
	 * 把key保存到文件中
	 * @param key
	 * @param fileName
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	private static void saveKey(Key key, String fileName)
			throws FileNotFoundException, IOException {
		FileOutputStream fosKey = new FileOutputStream(fileName);
		ObjectOutputStream oos = new ObjectOutputStream(fosKey);
		oos.writeObject(key);
		oos.close();
		fosKey.close();
	}
	
	/**
	 * 把二进制数据保存到文件中
	 * @param results
	 * @param fileName
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	private static void saveData(byte[] results, String fileName)
			throws FileNotFoundException, IOException {
		FileOutputStream fosData = new FileOutputStream(fileName);
		fosData.write(results);
		fosData.close();
	}
	
	/**
	 * 从文件中获取key
	 * @param fileName
	 * @return
	 * @throws FileNotFoundException
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	private static Key readKey(String fileName) throws FileNotFoundException, IOException,
			ClassNotFoundException {
		FileInputStream fisKey = new FileInputStream(fileName);
		ObjectInputStream oisKey = new ObjectInputStream(fisKey);
		Key key = (Key) oisKey.readObject();
		oisKey.close();
		fisKey.close();
		return key;
	}
	
	/**
	 * 从文件中读取二进制数据
	 * @param fileName
	 * @return
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	private static byte[] readData(String fileName) throws FileNotFoundException, IOException {
		FileInputStream fisData = new FileInputStream(fileName);
		// 方法1:把输入流拷贝到输出流,再把 输出流转换为byte数组
		// ByteArrayOutputStream baos = new ByteArrayOutputStream();
		// copyStream(fisData, baos);
		// byte[] src = baos.toByteArray();
		// 方法2:用available()方法来读取
		// available():返回可以不受阻塞地从此输入流中读取(或跳过)的估计剩余字节数。
		byte[] src = new byte[fisData.available()];
		int len = fisData.read(src);
		int total = 0;
		while (total < src.length) {
			total += len;
			len = fisData.read(src, total, src.length - total);
		}

		fisData.close();
		// baos.close();
		return src;
	}
}



转载请注明出处:http://www.naxsu.com/java-an-quan-dui-cheng-fei-dui-cheng-di-jia-mi-he-jie-mi-fu-yuan-dai-ma/
分享到:
评论

相关推荐

    Java对称与非对称加密解密(AES与RSA)

    Java对称与非对称加密解密(AES与RSA) 一、对称加密技术与非对称加密技术简述 二、对称加密技术与非对称加密技术的使用场景简述 三、Java实现使用的是AES的对称加密和RSA的非对称加密 备注:此文包括概念讲解和Java...

    Java毕业设计-基于JAVA的RSA文件加密软件的设计与实现(源代码+论文).rar

    该软件采用RSA非对称加密算法,对用户指定的文件进行加密和解密操作,确保文件数据的安全性和保密性。 主要特点: 1. **安全性高**:采用业界认可的RSA非对称加密算法,公钥加密、私钥解密,有效防止数据在传输...

    计算机信息安全对称密钥加密DES源代码(C++版)

    其中,key为加密/解密时使用的 密钥;data为加密/解密的数据;mode为其工作模式:当模式为加密模 式时,明文按照64位进行分组,形成明文分组,此时key用于对数据 加密;当模式为解密模式时,key用于对64位的密文...

    《Java加密与解密的艺术》源码

    实践篇不仅对电子邮件传输算法、消息摘要算法、对称加密算法、非对称加密算法、数字签名算法等现今流行的加密算法的原理进行了全面而深入的剖析,而且还结合翔实的范例说明了各种算法的具体应用场景。Java开发者将...

    java源代码信息安全加密

    信息安全 加密解密 对称 非对称数字签名 消息认证 防止抵赖

    c# 加密和解密相关代码

    图19.3 使用ROT13算法加密解密数据 关 键技术 本实例实现时,主要是用Convert 类的ToChar 方法来获取单个字符的Unicode 编码,然后将字母的前13 个和后13 个对调,从而实现加密的功能。下面对Convert类的ToChar 方法...

    Java Jct 加密解密工具包源码.rar

    Java Jct 加密解密工具包源码,WDSsoft免费源代码,java加密解密编程常用工具包 JCT 1.0,作者吴东升 常蕴秋,BlowfishTool.java封装同Blowfish对称加密算法有关的方法,包括了使用创建Blowfish密码,使用Blowfish加密...

    Java毕业设计-基于Misty1算法的加密软件(JAVA)的实现(源代码+论文).rar

    Misty1算法是一种广泛使用的对称加密算法,以其高效性和安全性著称。本软件通过实现Misty1算法,为用户提供了一个安全可靠的数据加密工具。项目源码结构清晰,注释详细,便于学习和二次开发。 主要功能包括: 1. ...

    RSA.rar_RSA加密文件_RSA加密解密和_rsa加密算法_对称 加密文件_对称加密

    RSA对称、非对称加密解密算法,源代码和可执行文件,希望对学习密码学的朋友有帮助!

    c#加密类源代码-加密后能解密

    #加密类源代码 ,实现对称加密,加密后能解密..适合各个项目 c#加密类 源代码 学习研究 c#加密类 源代码 学习研究

    对文件进行对称加密(源代码)

    对文件进行对称加密,可以选择不同的加密算法,里面还携带一个加密与解密的类,可以实现对任何类型的文件的加密与解密。

    Java加密与解密的艺术配书源代码

    对称加密网络应用242 7.8 小结254 第8章高等数据加密—非对称加密算法256 8.1 非对称加密算法简述256 8.2 密钥交换算法—DH 258 8.3 典型非对称加密算法—RSA 269 8.4 常用非对称加密算法—ElGamal277 8.5 实例:非...

    java源码包---java 源码 大量 实例

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道VB...

    Java毕业设计-基于Java的两个通用安全模块的设计与实现(源代码+论文).rar

    该模块实现了多种数据加密算法,包括对称加密、非对称加密和哈希算法。通过简单的API调用,开发者可以轻松地对数据进行加密和解密操作,确保数据在传输和存储过程中的安全性。此外,模块还支持自定义密钥生成和管理...

    Java非对称加密源码实例

    摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)...

    RSA加密解密C++版源代码

    软件思路:加密密钥和解密密钥的生成过程: ① 选取两个足够大的质数P和Q; ② 计算P和Q相乘所产生的乘积n=P*Q; ③ 找出一个小于n的数e,使其符合与(P-1)*(Q-1)互为质数; ④ 另找一个数d,使其满足(e*d) mod [(P-1)...

    java网上聊天加密系统源代码

    此网上聊天加密系统包含客户端和服务端 有登录、注册的功能 聊天信息传输过程中会进行加密,然后再进行解密 主要的加密方法有:AES、 MD5、一起一些非对称加密方法

    JAVA上百实例源码以及开源项目源代码

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道VB...

    AES加密解密算法

    实现的AES加密解密算法,高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥

    java C# IOS 通用对称加解密

    java C# IOS 通用对称加解密(AES),附件为java、C#、Objective-C下的通用互相加解密,有完整的源代码,并经过测试,如有问题请留言。

Global site tag (gtag.js) - Google Analytics