`

java安全-非对称加密/解密(附源码实现)

    博客分类:
  • java
阅读更多
加密和解密使用不同的密钥(公钥/私钥),有代表性的有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-fei-dui-cheng-jia-mi-jie-mi/
分享到:
评论

相关推荐

    基于Java的源码-非对称加密源码实例.zip

    这个压缩包“基于Java的源码-非对称加密源码实例.zip”很可能包含了若干个Java源代码文件,用于演示非对称加密算法如RSA、DSA或Elliptic Curve Cryptography (ECC)的应用。 非对称加密的核心思想是使用一对密钥,即...

    基于Java的实例源码-非对称加密源码实例.zip

    这个压缩包"基于Java的实例源码-非对称加密源码实例.zip"包含了关于如何在Java中实现非对称加密的具体代码示例。非对称加密的核心特点是使用一对公钥和私钥,其中公钥可以公开,而私钥必须保密。这种机制使得数据...

    RSA非对称加密解密Delphi源码

    RSA是一种非对称加密算法,由Ron Rivest、Adi ...通过学习和理解这段Delphi RSA源码,开发者不仅可以掌握RSA加密技术,还可以深入了解非对称加密算法的实现细节,同时提高在Delphi环境下编写安全、高效代码的能力。

    Java非对称加密源码实例

    Java非对称加密技术是一种基于数学算法的安全加密方式,它主要使用两个密钥:公钥和私钥。这种加密方式的核心在于,公钥可以公开给任何人,用于加密数据;而私钥必须保密,用于解密数据。这样,即使数据在传输过程中...

    Java实现Rsa非对称分段加解密方法源码分享

    在IT领域,安全是至关重要的...在`RsaEncrypt.java`文件中,应该包含了具体的实现细节,如密钥的生成、加密解密的逻辑以及可能的分段处理等。通过理解并实践这些代码,开发者可以更好地掌握RSA加密在实际项目中的应用。

    RSA加密/解密算法源码 C++类

    RSA加密/解密算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。这种算法基于两个大素数的乘积和欧拉函数的性质,提供了一种在互联网上安全交换信息的方法。RSA的...

    Java源码非对称加密.rar

    本资源“Java源码非对称加密.rar”显然包含了一些使用Java编程语言实现非对称加密算法的源代码示例。下面我们将深入探讨非对称加密的概念、原理以及Java中如何实现这一技术。 非对称加密与传统的对称加密不同,对称...

    基于Java的实例源码-很强的加密解密算法源码.zip

    总的来说,这份基于Java的加密解密算法源码实例是一个全面的学习资源,涵盖了多种加密技术,可以帮助开发者提高其在网络安全领域的技能,理解并应用这些技术来保护用户数据,确保软件产品的安全性。同时,通过研究...

    c#加密解密源码

    本文将围绕"C#加密解密源码"这一主题,深入探讨C#中加密解密的基本原理、常用算法以及如何通过源代码实现。 1. 加密与解密基础 - 加密:将明文转换为密文的过程,目的是保护数据的安全,防止未经授权的访问。 - ...

    Java非对称加密源码实例.rar

    Java非对称加密技术是一种基于数学难题的安全加密方法,它主要使用两个密钥:公钥和私钥。这种加密方式在网络安全中起着至关重要的作用,例如在HTTPS协议、SSH连接以及数字签名等方面都有广泛应用。在Java中,非对称...

    JAVA 文件加密解密(附源码)

    通过对这些知识点的理解和实践,你可以掌握Java中文件加密解密的基本技巧,从而能够应用于实际项目中,保护敏感数据的安全。在学习过程中,如果遇到不理解的部分,可以查阅相关文档或在线教程以获取更多帮助。

    AES加密/解密源码,可在VC6下使用

    总之,AES加密/解密源码提供了在VC6环境下使用C语言实现对称加密的基本工具。通过理解和应用这些源码,开发者可以构建安全的加密系统,保护数据免受未经授权的访问。不过,需要注意的是,安全不仅仅是算法的选择,还...

    aes、ras,前端js加密,后端java解密

    在IT领域,加密技术是确保数据安全的重要手段。在给定的标题和描述中,我们涉及到了两种主要的加密算法:AES(高级加密...此外,对于非对称加密,公钥可以在公开场合分发,而私钥必须严格保密,以免数据被非法解密。

    RSA非对称加解密实例

    RSA非对称加密是一种广泛应用的公钥加密算法,由Ron Rivest、Adi Shamir和Leonard ...通过学习和理解"RSA非对称加解密实例"的源码,开发者可以更好地掌握加密解密技术,并将其应用到实际项目中,保障数据的安全传输。

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

    Java中的`java.security`包提供了`KeyPairGenerator`和`KeyPair`类用于生成公钥和私钥对,以及`Cipher`类用于处理非对称加密。RSA和DSA是非对称加密的典型代表。 3. **哈希函数**:哈希函数将任意长度的数据转换为...

    Java非对称加密源码实例.zip

    这个"Java非对称加密源码实例.zip"可能包含了一些这样的示例,演示如何在Java中实现上述步骤,帮助开发者更好地理解和应用非对称加密。通过分析和学习这些源码,你可以更深入地理解非对称加密的工作原理,并将其应用...

    前端使用jsencrypt加密后端使用java RSA解密功能实现源码

    首先,RSA是一种非对称加密算法,基于两个密钥:公钥和私钥。公钥用于加密数据,而私钥用于解密。这种方式保证了即使数据在传输过程中被截取,没有私钥的攻击者也无法解密信息,从而确保了数据的安全性。 `...

    加密/解密字符串的控件

    非对称加密安全性高,但速度较慢,常用于密钥交换。 2. **控件**:在编程领域,控件通常指的是可以在用户界面(UI)上添加并交互的组件。这里的“加密/解密字符串的控件”可能是一个软件组件,可以直接嵌入到应用...

Global site tag (gtag.js) - Google Analytics