首页 > 编程语言 >RSA算法

RSA算法

时间:2023-07-02 21:56:29浏览次数:39  
标签:公钥 私钥 String RSA 算法 密钥 加密 Bob

1. 前言

RSA加密是工作中非常常见的加密算法之一,我们今天来详细看看它的加密流程以及代码。

2. 非对称算法

我们知道AES是对称算法,RSA是非对称算法。那么为什么会有对称以及非对称算法呢,非对称算法是不是比对称算法要安全呢?

对称加密,顾名思义,加密方与解密方使用同一钥匙(秘钥)。具体一些就是,发送方通过使用相应的加密算法和秘钥,对将要发送的信息进行加密;对于接收方而言,使用解密算法和相同的秘钥解锁信息,从而有能力阅读信息。

非对称算法也叫公钥算法,在公钥密码系统中,加密和解密使用的是不同的密钥,这两个密钥之间存在着相互依存关系:即用其中任一个密钥加密的信息只能用另一个密钥进行解密。这使得通信双方无需事先交换密钥就可进行保密通信。其中加密密钥和算法是对外公开的,人人都可以通过这个密钥加密文件然后发给收信者,这个加密密钥又称为公钥;而收信者收到加密文件后,它可以使用他的解密密钥解密,这个密钥是由他自己私人掌管的,并不需要分发,因此又成称为私钥,这就解决了密钥分发的问题。

2.1 具体交互流程

公钥通信的流程
假设Alice 要给Bob发送一条消息,Alice 是发送者,Bob是接收者
Alice(公钥加密)  ==> Bob(私钥解密)

在公钥密码通信中,通信过程是由接收者Bob来启动。
(1)Bob 生成一个包含公钥和私钥的密钥对。
私钥由Bob自行妥善保管。
(2)Bob 将自己的公钥发送给Alice。
将公钥发送给Alice,表示Bob 请Alice 用这个公钥对消息进行加密并发送给他。
(3)Alice用Bob的公钥对消息进行加密。
加密后的消息需要用Bob 私钥才能够解密。
虽然Alice 拥有Bob的公钥,但是Bob的公钥是无法对密文进行解密的。
(4)Bob 用自己的私钥对密文进行解密。
通信完成,至此,整个流程都是安全的。

2.2 安全性保证

我们可以看下下图:Bob拿公钥B加密,只有Alice的私钥B才能解密
同样。Alice拿公钥A加密,只有Bob的私钥A才能解密
这样就能保证,只要私钥不泄露,传输一定是加密的并且不会被第三方破解(大概率)

3. 用法

3.1 生成RSA公私钥

两者选其一即可,如果需要存的话就转化成string即可。

public static final String KEY_ALGORITHM = "RSA";
public static final String SIGNATURE_ALGORITHM = "SHA256withRSA";

public static Pair<PublicKey, PrivateKey> genKeyPair() throws Exception {
	// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
	KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");

	// 初始化密钥对生成器,密钥大小为
	keyPairGen.initialize(2048, new SecureRandom());

	// 生成一个密钥对,保存在keyPair中
	KeyPair keyPair = keyPairGen.generateKeyPair();

	// 得到私钥、公钥
	PrivateKey privateKey = keyPair.getPrivate();
	PublicKey publicKey = keyPair.getPublic();
	return new Pair<>(publicKey, privateKey);
}

public static Pair<String, String> genKeyPairString() throws Exception {
	Pair<PublicKey, PrivateKey> pair = genKeyPair();

	// 得到私钥、公钥
	PublicKey publicKey = pair.getKey();
	PrivateKey privateKey = pair.getValue();

	// 得到私钥字符串
	String publicKeyString = Base64.encodeBase64String(publicKey.getEncoded());
	String privateKeyString = Base64.encodeBase64String((privateKey.getEncoded()));
	return new Pair<>(publicKeyString, privateKeyString);
}

3.2 公钥加密

// 公钥加密
public static String encryptByPublicKey(String plainText, PublicKey publicKey) {
	try {
		Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		byte[] enBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
		return Base64.encodeBase64String(enBytes);
	} catch (Exception e) {
		// error
	}
	return null;
}

3.3 私钥解密

// 私钥解密
public static String decryptByPrivateKey(String enStr, PrivateKey privateKey) {
	try {
		Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		byte[] deBytes = cipher.doFinal(Base64.decodeBase64(enStr));
		return new String(deBytes);
	} catch (Exception e) {
		// error
	}
	return null;
}

3.4 示例代码

public class Main {
	public static void main(String[] args) throws Exception {

		Pair<PublicKey, PrivateKey> pair = RSAUtils.genKeyPair();
		PublicKey publicKey = pair.getKey();
		PrivateKey privateKey = pair.getValue();

		String s = "Hello World";

		String encrypt = RSAUtils.encryptByPublicKey(s, publicKey);
		System.out.println("length = " + encrypt.length() + ", encrypt = " + encrypt);
		System.out.println(RSAUtils.decryptByPrivateKey(encrypt, privateKey));

	}
}

标签:公钥,私钥,String,RSA,算法,密钥,加密,Bob
From: https://www.cnblogs.com/wenbochang/p/17512665.html

相关文章

  • 【学习笔记】Bostan-Mori 算法
    其实是用于常系数齐次线性递推,只不过本篇博文只讲解如何求分式的高次项系数。已知多项式\(f(x),g(x)\),要求:\([x^k]\dfrac{f(x)}{g(x)}\),其中\(f(x),g(x)\)的次数为\(n,m\),\(n,m\le10^5,k\le10^9\)。算法流程如下:分式上下同乘\(g(-x)\),也就是\(g\)的奇次项都取反的多项......
  • 算法——二分查找
    1、在有序数组中查找元素的第一个和最后一个位置1classSolution{2publicint[]searchRange(int[]nums,inttarget){3intleftindex=binarySearch(nums,target);4intrightindex=binarySearch(nums,target+1)-1;5if(leftindex=......
  • 算法学习
    今天听杨老师说的,我们要去学和发展不同那些在it培训班的领域,但是我们只能从那些B站那些培训课去学习,并没有亮点,可能毕业后,还不如培训班出来的呢,所以我打算算法上面下下功夫,以后的计划是加强javaC++这两门语言基础,然后每天一道算法题。 ......
  • 二分算法学习笔记与总结
    二分算法学习笔记与总结目录二分二分原理整数二分二分查找原理二分查找模板模板一模板二二分查找用法题目1(模板)(二分查找)题目大意题目分析CODE题目2(运用)(二分查找)题目大意题目分析CODESTL中的二分查找lower_bound()upper_bound()浮点二分浮点数二分模板浮点数二分答案模板题目......
  • Snap算法学习01-03Snap中的类及其定义
        //graph.h定义的基本类型无向图  ///Undirectedgraph.##TUNGraph::ClassclassTUNGraph 有向图///Directedgraph.##TNGraph::ClassclassTNGraph 二部图///Bipartitegraph.##Bipartite_graphclassTBPGraph 多重图///Directedmultigr......
  • 什么是算法?
    扎实打牢数据结构算法根基,从此不怕算法面试系列之001week0102-01什么是算法? 1、什么是算法?为了明确什么是算法,我们会从简单的查找功能开始讲起。查找其实一个一个非常简单的算法,但我们会为这个查找功能的算法做如下工作:让查找的功能适应更多的数据类型通过查找的例......
  • 数据结构和算法-2023.07.01
    数据结构杂记回忆以前的一些零散的知识点杂谈......
  • 二叉树中的递归算法(二)
    从二叉树遍历看递归二叉树二叉树(binarytree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。二叉树的遍......
  • 2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?
    2023-07-01:redis过期策略都有哪些?LRU算法知道吗?答案2023-07-01:缓存淘汰算法(过期策略)当Redis的内存超出物理内存限制时,内存中的数据就会频繁地与磁盘进行交换,这个过程叫做交换(swap)。由于交换的高开销,Redis的性能会急剧下降。对于访问频率较高的Redis实例来说,这样低效的存取效率......
  • 2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?
    2023-07-01:redis过期策略都有哪些?LRU算法知道吗?答案2023-07-01:缓存淘汰算法(过期策略)当Redis的内存超出物理内存限制时,内存中的数据就会频繁地与磁盘进行交换,这个过程叫做交换(swap)。由于交换的高开销,Redis的性能会急剧下降。对于访问频率较高的Redis实例来说,这样低效的存取效率几乎......