`
史蒂芬洛兹
  • 浏览: 3205 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

关于RSA非对称加密的一点心得

阅读更多

   最近的一个项目中,要用到加密的知识。于是上网查了一些资料,翻看了一本很久以前买的书《JAVA加密与解密的艺术》,然后自己琢磨了一下,最后决定用了RSA典型非对称加密算法。下面就自己研究的代码分享一下。
    

package com.security.rsa;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.Cipher;

/**
 * RSA安全编码组件
 * @author Administrator
 *
 */
public abstract class RSACoder {

	//非对称加密密钥算法
	public static final String KEY_ALGORITHM="RSA";
	//公钥
	private static final String PUBLIC_KEY="RSAPublicKey";
	//私钥
	private static final String PRIVATE_KEY="RSAPrivateKey";
	
	
	private static FileOutputStream public_file_out = null;
	private static ObjectOutputStream public_object_out = null;
	private static FileOutputStream private_file_out = null;
	private static ObjectOutputStream private_object_out = null;
	/**
	 * RSA密钥长度
	 * 默认1024位
	 * 密钥长度必须是64的倍数
	 * 范围在512-65536
	 */
	
	private static final int KEY_SIZE=512;
	
	/**
	 * 私钥解密
	 * @param data 待解密数据
	 * @param key 私钥
	 * @param byte[] 解密数据
	 * @throws Exception
	 * 
	 */
	public static byte[] decryptByPrivateKey(byte[] data,byte[] key) throws Exception {
		//取得私钥
		PKCS8EncodedKeySpec pkcs8keyspec = new PKCS8EncodedKeySpec(key);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		//生成私钥
		PrivateKey privatekey =keyFactory.generatePrivate(pkcs8keyspec);
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.DECRYPT_MODE, privatekey);
		
		return cipher.doFinal(data);
	}
	
	/**
	 * 公钥解密
	 * @param data 待解密数据
	 * @param key 公钥
	 * @param byte[] 解密数据
	 * @throws Exception
	 */
	public static byte[] decryptByPublicKey(byte[] data,byte[] key) throws Exception{
		
		//取得公钥
		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		//生成公钥
		PublicKey publickey = keyFactory.generatePublic(x509KeySpec);
		//对数据解密
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.DECRYPT_MODE, publickey);
		
		return cipher.doFinal(data);
	}
	
	/**
	 * 公钥加密
	 */
	public static byte[] encryptByPublicKey(byte[] data,byte[] key) throws Exception{
		//取得公钥
		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		PublicKey publickey = keyFactory.generatePublic(x509KeySpec);
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.DECRYPT_MODE, publickey);
		return cipher.doFinal(data);
	}
	
	
	
	/**
	 * 私钥加密
	 */
	public static byte[] encryptByPrivateKey(byte[] data,byte[] key) throws Exception{
		PKCS8EncodedKeySpec  pkcs8KeySpec =new PKCS8EncodedKeySpec(key);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
		//对数据加密
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		
		return cipher.doFinal(data);
	}
	
	/**
	 *取得私钥
	 */
	public static byte[] getPrivateKey(Map<String,Object> keyMap) throws Exception{
		Key key =(Key) keyMap.get(PRIVATE_KEY);
		return key.getEncoded();
	}
	/**
	 * 取得公钥
	 */
	
	public static byte[] getPublicKey(Map<String,Object> keyMap) throws Exception{
		Key key =(Key) keyMap.get(PUBLIC_KEY);
		return key.getEncoded();
	}
	
	/**
	 * 初始化密钥
	 */
	public static Map<String,Object> initKey() throws Exception{
		
		//实例化密钥对生成器
		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
		//初始化密钥对生成器
		keyPairGen.initialize(KEY_SIZE);
		//生成密钥对
		KeyPair  keyPair = keyPairGen.generateKeyPair();
		//公钥
		RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic();
		//私钥
		RSAPrivateKey privateKey =(RSAPrivateKey) keyPair.getPrivate();
		//封装密钥
		Map<String,Object> keyMap = new HashMap<String, Object>(2);
		
		keyMap.put(PUBLIC_KEY, publicKey);
		keyMap.put(PRIVATE_KEY, privateKey);
		
		
//		//将公钥放到D盘根目录下
//		public_file_out = new FileOutputStream("d:/" + "/public_key.cer");
//		public_object_out = new ObjectOutputStream(public_file_out);
//		public_object_out.writeObject(publicKey);
//		saveKey(publicKey, "publicKey.cer");
//		
//		
//		//将私钥放到D盘根目录下
//		private_file_out = new FileOutputStream("d:/" + "/private_key.key");
//		private_object_out = new ObjectOutputStream(private_file_out);
//		private_object_out.writeObject(publicKey);
		
		
		saveKey(publicKey, "public_key.cer");
		saveKey(privateKey, "private_key.key");
		
		return keyMap;
	}
	
	
	/**
	 * 保存密钥的方法
	 * @param key
	 * @param keyName
	 * @throws Exception
	 */
	public static void saveKey(Key key,String keyName) throws Exception{
		FileOutputStream foskey=new FileOutputStream(keyName);
		ObjectOutputStream oos=new ObjectOutputStream(foskey);
		oos.writeObject(key);
		oos.close();
		foskey.close();
	}
	
	
}

 RSACoder 是基础类。下面是测试类,不过测试类写的比较简单。 

package com.security.rsa.test;

import java.util.Map;

import org.apache.commons.codec.binary.Base64;
import org.junit.Before;
import org.junit.Test;

import com.security.rsa.RSACoder;

/**
 * RSA校验
 * @author Administrator
 *
 */
public class RSACoderTest {

	//公钥
	private byte[] privateKey;
	//私钥
	private byte[] publicKey;
	
	
	/**
	 * 初始化密钥
	 */
	@Before
	public void initKey() throws Exception{
		Map<String,Object> keyMap = RSACoder.initKey();
		
		publicKey = RSACoder.getPublicKey(keyMap);
		privateKey = RSACoder.getPrivateKey(keyMap);
		
		System.err.println("公钥:\n"+Base64.encodeBase64String(publicKey));
		System.err.println("私钥:\n"+Base64.encodeBase64String(privateKey));
		
	}
	
	
	
	/**
	 * 校验
	 * 
	 */
	@Test
	public void test() throws Exception{
		
		
		System.err.println("\n-----私钥加密-----公钥解密");
		String inputStr1 = "RSA算法加密";
		byte[] data1 = inputStr1.getBytes();
		System.err.println("原文:\n"+inputStr1);
		//加密
		byte[] encodeData1 = RSACoder.encryptByPrivateKey(data1, privateKey);
		System.err.println("加密后:\n"+Base64.encodeBase64String(encodeData1));
		//解密
		byte[] decodeData1 = RSACoder.decryptByPublicKey(encodeData1, publicKey);
		String outputStr1 = new String(decodeData1);
		System.err.println("解密后:\n"+outputStr1);
	}
}

   写这篇文章记录一下最近的历程。当然加密解密的路远不止这么简单,希望自己接下来能多学习,多成长,共勉!

分享到:
评论

相关推荐

    基于RSA的加密算法的实验报告

    RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,其名称即来源于这三位发明者的姓氏首字母。RSA的主要特点是使用了一对密钥——公钥和私钥,它们互为逆运算。这意味着,如果用...

    设计一个使用RSA算法进行加密解密的系统网络安全基础课程设计word格式.doc

    RSA算法是一种非对称加密算法,使用公钥和私钥来实现加密和解密。公钥用于加密,私钥用于解密。RSA算法的安全性基于大数分解的难度和Discrete Logarithm Problem的难度。 2. 系统设计和实现 本课程设计的目标是设计...

    RSA实验报告

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman三位学者在1977年提出。其安全性基于大数分解的困难性。主要步骤如下: 1. **选择两个大的素数**:选择两个足够大的素数`p`和`q`,一般...

    非对称加密&&RAS算法学习经验

    在描述中提到的RAS算法可能是指RSA算法,这是一种最广泛使用的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。RSA基于数论中的大数因子分解难题,其安全性与能否高效地分解大素数有关。...

    基于MATLAB的RSA仿真程序

    RSA算法是一种广泛应用于网络安全的非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。它的基本原理是基于两个大素数的乘积非常难以分解,而找到这两个素数相对容易。在MATLAB中,可以编写...

    信息安全基础密码学部分实习报告(含代码)

    本实习报告主要探讨了密码学的基础知识,包括对称加密、非对称加密、哈希函数以及数字签名等关键技术,并包含了能够正确运行的相关代码,旨在通过实践加深理论理解。 **一、对称加密** 对称加密是最古老的加密方式...

    MD5和RSA及DES的学习实践

    RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。它的核心思想是公钥和私钥的分离:任何人都可以获取公钥进行加密,但只有拥有对应私钥的人才能解密。这使得RSA在安全通信、数字...

    加密实验帮助文档

    通过此次实验,参与者不仅学会了如何使用PGP软件进行邮件的加密与签名,还深入了解了非对称加密技术的工作原理及其在网络通信中的重要性。此外,通过实际操作,对数字签名及其在保障信息安全方面的作用有了更加直观...

    2021网络安全培训心得体会.docx

    20世纪70年代,公钥密码学的出现,如Diffie和Hellman的经典算法,开创了密码学的新纪元,使得非对称加密成为可能,极大地推动了网络安全的进步。 密码学由两个分支构成:密码编码学(加密)和密码分析学(解密)。...

    密码学实验报告

    5. **RSA**:RSA是一种非对称加密算法,基于大数因子分解的困难性。它包含一对密钥,公钥用于加密,私钥用于解密,广泛应用于数字证书和网络通信中的身份验证。 6. **DSA(Digital Signature Algorithm)**:DSA是...

    Python 加密与解密小结

    - **非对称加密算法** - **特点**:使用一对密钥进行加密和解密,公钥用于加密,私钥用于解密。 - **优缺点**:安全性较高,适合于密钥交换过程中的安全通信;但加解密速度相对较慢。 - **常见算法**:RSA...

    openssl学习资料大全

    2. **加密算法**:包括对称加密(如AES)、非对称加密(如RSA)、哈希函数(如SHA)和消息认证码(如HMAC)等。 3. **SSL/TLS协议**:讲解SSL/TLS的工作原理,握手过程,以及如何确保网络通信的安全。 4. **证书管理...

    2021网络安全心得体会.docx

    这些算法的出现,使得非对称加密成为可能,极大地增强了网络安全。 密码学的应用不仅限于加密通信,还包括数字签名、身份验证、数据完整性保护等多个方面。在现代网络环境中,HTTPS、SSL/TLS协议等都是密码学技术的...

    安全云存储系统技术总结

    加密技术分为对称加密和非对称加密。对称加密效率高,但需要安全地传递密钥;非对称加密虽处理速度慢,但密钥管理更为灵活。 其次,访问控制是确保只有授权用户才能访问相应资源。实现访问控制的方法包括访问控制...

    总结报告1

    - 加密传输:采用DES对文件内容进行对称加密,通过RSA非对称加密保护DES密钥,确保数据在传输过程中的安全性。 - 用户管理:注册、登录、个人信息管理,以及权限控制,允许用户设置不同的访问权限。 - 文件管理:...

    密码引论心得1

    非对称密码体制,如公钥密码体制,使用一对不同的密钥,一个用于加密,另一个用于解密,这极大地增强了安全性。 其次,密码学的应用广泛,不仅限于军事和外交领域,现代生活中无处不在,包括电子邮件、网络安全、...

    2022广工网络安全实验(实训系统考核题+综合题+心得).docx

    - **背景介绍**:RSA是一种非对称加密算法,基于大整数因子分解的数学难题来确保安全性。 - **实验目的**:理解RSA算法的工作原理及其实施过程。 - **实验总结**:通过实验,学生不仅学会了如何使用RSA算法进行加密...

    2021网络信息安全学习心得体会.docx

    ### 网络信息安全学习心得体会 #### 一、引言 随着信息技术的飞速发展,网络信息安全已成为现代社会不可或缺的一部分。在网络信息安全的学习过程中,不仅能够深刻理解到信息安全的重要性,还能够掌握保护个人信息...

    OPENSSL

    《深入理解OPENSSL:从基础到实践》 一、基础知识:加密算法的基石 ...无论是对称加密、公钥加密、摘要算法还是高级数据结构,OpenSSL都提供了详尽的API和文档支持,是学习和研究网络安全的理想平台。

Global site tag (gtag.js) - Google Analytics