`
zhangzhiqiangss
  • 浏览: 10945 次
社区版块
存档分类
最新评论

RSA

 
阅读更多

RSA 典型非对称加密算法,既可用于数据加密,也可用于数字签名.

"私钥加密,公钥解密" "公钥加密,私钥解密"

 

package rsa;

import java.security.Key;
/*
 * KeyFactory用来生成公钥或私钥,或者说通过密钥规范还原密钥
 */
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;

/*
 * spec:规格,说明
 * java.security.spec 提供了密钥规范和算法参数规范的类和接口
 * 以下两个类都是EncodedKeySpec的子类
 * X509EncodedKeySpec用于转换公钥编码密钥, 以编码格式来表示公钥,以X.509标准作为密钥规范管理的编码格式
 * PKCS8EncodedKeySpec用于转换私钥编码密钥,以编码格式来表示私钥,以PKCS#8标准作为密钥规范管理的编码格式
 * 
 */
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import java.util.HashMap;
import java.util.Map;

import javax.crypto.Cipher;

public class RSACoder {
	//非对称加密算法
	public static final String KRY_ALGORITHM = "RSA";
	//公钥
	private static final String PUBLIC_KEY = "RSAPublicKey";
	//私钥
	private static final String PRIVATE_KEY = "RSAPrivatekey";
	/**
	 * 密钥长度
	 * 默认1024位
	 * 密钥长度必须为64的倍数
	 * 范围在512-65536之间
	 */
	private static final int KEY_SIZE = 1024+256;
	
	/**
	 * 加解密流程:
	 * PKCS8EncodedKeySpec或X509EncodedKeySpec转换密钥材料
	 * 根据加密算法实例化工厂,
	 * 利用工厂生成密钥
	 * 实例化Cipher,并传入加密算法
	 * 对数据进行加解密
	 * @param data
	 * @param key
	 * @return
	 * @throws Exception
	 */
	
	
	
	//私钥解密
	public static byte[] decryptByPrivateKey(byte[] data,byte[] key) throws Exception{
		//实例化PKCS8EncodedKeySpec对象,由私钥密钥字节数组获得密钥规范(实际使用过程中密钥以字节数组的形式保存和传输)
		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
		//实例化KeyFactory,并指定算法
		KeyFactory  keyFactory = KeyFactory.getInstance(KRY_ALGORITHM);
		//生成私钥
		PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
		//对数据解密
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.DECRYPT_MODE,privateKey);
		return cipher.doFinal(data);
	}
	
	//公钥解密
	public static byte[] decryptByPublicKey(byte[] data,byte[] key)throws Exception{
		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
		KeyFactory keyFactory = KeyFactory.getInstance(KRY_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(KRY_ALGORITHM);		
		PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		return cipher.doFinal(data);
	}
	
	//私钥加密
	public static byte[] encryptByPrivateKey(byte[] data,byte[] key)throws Exception{
		PKCS8EncodedKeySpec pkcsKeySpec = new PKCS8EncodedKeySpec(key);
		KeyFactory keyFactory = KeyFactory.getInstance(KRY_ALGORITHM);		
		PrivateKey privateKey = keyFactory.generatePrivate(pkcsKeySpec);		
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		return cipher.doFinal(data);
	}
	
	public static byte[] getPrivateKey(Map<String,Object> keyMap){
		Key key = (Key) keyMap.get(PRIVATE_KEY);
		return key.getEncoded();
	}
	
	public static byte[] getPublicKey(Map<String,Object> keyMap){
		Key key = (Key) keyMap.get(PUBLIC_KEY);
		return key.getEncoded();
	}

	/**
	 * 初始化密钥
	 * 
	 */
	public static Map<String, Object> initKey()throws Exception{
		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KRY_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);
		return keyMap;
	}
	

}

 

 

 

分享到:
评论

相关推荐

    rsa.zip_QT RSA加密算法_Qt rsa加密_qt rsa加密步骤_rsa_rsa算法 qt

    在本项目中,"rsa.zip_QT RSA加密算法_Qt rsa加密_qt rsa加密步骤_rsa_rsa算法 qt",开发者已经实现了RSA加密算法,并结合Qt创建了一个具有图形界面的应用,使得加密过程更为直观易用。 首先,我们来深入理解RSA...

    RSA签名验签工具windows_V1.4.zip_rsa_rsa2生成签名_rsa签名工具_工具_验签

    RSA签名验签工具是用于处理数字签名的一种实用软件,尤其在网络安全和电子商务中扮演着重要角色。这个名为“RSA签名验签工具windows_V1.4.zip”的压缩包包含了一个适用于Windows操作系统的工具,版本为V1.4,专门...

    rsa2048.rar_RSA2048_RSA2048加密算法_rsa2048.rar_rsa_2048_site:www.pu

    RSA2048是一种基于公钥密码体制的加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是目前广泛使用的一种非对称加密技术。在这个标题和描述中,我们关注的是2048位的RSA算法,它在加密解密过程中...

    RSA加密算法在VB中的实现.rar_RSA VB_VB RSA_rsa加密算法_vb rsa_vb 加密

    RSA加密算法是公钥密码学领域的一个里程碑,它由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。这种算法基于大整数因子分解的困难性,使得它在信息安全领域被广泛用于数据加密和数字签名。在...

    RSA和RSA2签名算法区别.md

    ### RSA与RSA2签名算法的区别 #### 数字签名概述 数字签名是一种确保数据完整性和验证发送者身份的技术手段。在实际应用中,数字签名通常包括两个步骤:摘要和非对称加密。首先,通过对需要签名的数据进行摘要处理...

    rsa2048.rar RSA2048的C语言实现代码

    在本文中,我们将深入探讨RSA2048的C语言实现及其相关知识点。 1. RSA算法基础: RSA算法由Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出,它是一种非对称加密算法,意味着加密和解密使用不同的密钥。RSA...

    C#RSA加密DEMO

    C# 是一种广泛使用的编程语言,它提供了丰富的库来支持各种加密算法,其中包括RSA(Rivest-Shamir-Adleman)加密。RSA是一种非对称加密算法,它的特点是拥有两个密钥:公钥和私钥,分别用于加密和解密。 在这个"C# ...

    易语言 rsa加密 易语言 rsa加密易语言 rsa加密

    易语言 rsa加密 易语言 rsa加密易语言 rsa加密

    RSA.rar_1024 RSA_2048位RSA_rsa_rsa-2048_rsa加密算法

    RSA加密算法是公钥密码学领域中的一个经典算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它基于大整数因子分解的困难性,为数据通信提供安全的加密手段。在本压缩包文件中,我们可能...

    RSA离线签名工具

    RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于网络安全领域,包括数字签名、数据加密以及身份验证等。在这个场景中,"RSA离线签名工具"是一个专门用于生成和验证RSA数字签名的软件。下面我们将深入...

    Delphi RSA加解密【支持RSA公钥加密私钥解密,RSA私钥加密公钥解密,秘钥格式支持PKCS8和PKCS1】D7~XE10可用

    在IT领域,特别是软件开发中,安全通信是至关重要的,而RSA算法是广泛使用的非对称加密技术之一。本文将详细讲解Delphi环境下如何实现RSA加解密,并着重讨论其支持的公钥加密私钥解密以及私钥加密公钥解密的功能,...

    RSA-delphi7-XE.rar_delphi rsa_delphixe RSA256_libeay32.pas_xe 10

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,如数字签名、数据加密等。这个"RSA-delphi7-XE.rar"压缩包包含了用Delphi编程语言实现的RSA算法,适用于Delphi XE版本。Delphi是Embarcadero ...

    RSA的jar包,js和RSA的java工具类

    这个压缩包包含与RSA相关的JAR包、JavaScript文件以及Java工具类,主要用于在JSP应用中实现密码的加密和解密。以下是对这些资源及其在实际应用中的作用的详细解释。 1. RSA算法原理: RSA基于数论中的大数因子分解...

    rsa2048签名算法

    RSA2048签名算法是一种基于非对称加密技术的数字签名方法,广泛应用于网络安全、数据完整性保护以及身份验证等领域。在本文中,我们将深入探讨RSA2048签名算法的原理、工作流程以及其在实际应用中的重要性。 RSA...

    Delphi RSA 加密解密签名验签控件 RSA_Component(1.0.0.0).rar

    RSA加密演算法是一种非对称加密演算法。在公开密钥加密和电子商业中RSA被广泛使用。 典型的应用 1. 苹果App签名, iOS App 签名的原理; 2. 支付宝签名验证 ; 2. HTTPS 加密连接; 3. 程序直接用RSA+AES加密通信 ...

    RSA公私钥生成工具 RSA秘钥生成工具

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是目前应用最广泛的公开密钥加密技术。该算法基于大数因子分解的数学难题,使得加密过程相对简单,但破解极其困难。 在RSA...

    VC++实现RSA算法

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因其发明者的名字首字母而得名。在VC++中实现RSA算法需要理解其核心原理,包括大整数运算、素数检测、欧拉函数以及模逆运算...

    rsa.zip_RSA 公钥加密_rsa_rsa私钥加密

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在数据传输的安全性上。这个zip压缩包“rsa.zip”显然包含了关于RSA加密算法的实现,可能是一个C语言编写的程序“ras.c”。在这里,我们将深入...

    rsa共模攻击_rsa共模攻击_pythonrsa共模_rsa攻击方式_rsapython_rsa共模_

    RSA算法是一种非对称加密算法,它基于大数因子分解的困难性,广泛应用于网络安全领域,如数字签名、数据加密等。然而,RSA系统并非无懈可击,其中一种潜在的攻击方式就是“共模攻击”(Common Modulus Attack)。在...

    RSA.rar_RSA算法_寻找大素数 rsa_数论算法_简单数论

    RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。...

Global site tag (gtag.js) - Google Analytics