RSA密码体制
公钥算法的基本数论知识
公钥密码学中大部分引用了数论的成果,所以必要在介绍RSA密码体制之前,详细介绍一下所使用的几个数论的知识点
欧几里得算法
欧几里得算法主要是解决最大公约数问题,记两个正整数\(r_0\)和\(r_1\)的\(gcd\)表示:
\]
在公钥体系中,安全性依赖于大整数的因式分解通常是不可能的。所以人们通常使用一种更有效的算法计算gcd,即欧几里得算法,此算法基于一个简单的观察:
\]
其中,假设\(r_0 > r_1\),且二者均为正整数,不难理解:
\]
显然地,只要满足\((r_0-mr_1) > 0\),那么可以得到:
\]
如果m选择了最大值,则此算法可以表示为:
\]
事实证明,最终的gcd就是原始问题的gcd,即:
\]
扩展欧几里得算法
扩展欧几里得算法可以用来计算模逆元,不难理解,上文所述的欧几里得算法就是轮询反复互减最终得到结果的,换句话说,可以将这样的反复互减看作是原始两个参数的s倍与t倍相加,即:
\]
这个等式通常也称为丢番图方程。
可以得到,扩展的欧几里得算法(EEA):
输入:正整数\(r_0\)和\(r_1\),且\(r_0 > r_1\)
输出:\(gcd(r_0, r_1)\),以及满足\(gcd(r_0, r_1) = s·r_0 + t·r_1\)的s和t
initialize:
s[0] = 1
t[0] = 0
s[1] = 0
t[1] = 1
i = 1
algorithm:
do
i = i + 1
r[i] = r[i - 2] mod r[i - 1]
q[i - 1] = (r[i - 2] - r[i]) / r[i - 1]
s[i] = s[i - 2] - q[i - 1] * s[i - 1]
t[i] = t[i - 2] - q[i - 1] * t[i - 1]
while r[i] != 0
return:
gcd(r[0], r[1] = r[i - 1]
s = s[i - 1]
t = t[i - 1]
欧拉函数
在环\(Z_m = {0,1,\cdots,m-1}\)中,我们感兴趣的问题是在这个集合中,有多少个数字与m互素。
于是我们可以定义欧拉函数来进行计算:
\(Z_m\)内与m互素的整数个数可以表示为\(\Phi(m)\)
如果数值非常大的话,将集合内的元素从头到尾都处理一遍,计算每一个的gcd非常慢,对应的欧拉函数值得求解也非常困难,但是,如果m的因式分解是已知的,则存在一个更简单的计算方法:
假设m可以因式分解为一下的数的连乘:
\]
其中,\(p_i\)表示不同的素数,\(e_i\)表示正整数,则有:
\]
需要强调的是,这种方法来快速计算欧拉函数,我们必须知道m的因式分解,这个特征你刚刚也是RSA公钥方案的核心。
费马小定理与欧拉函数
费马小定理如下描述:假设a为一个整数,p为一个素数,则
\]
该定理在密码学中非常有用,其中一个应用就是计算有限域内某个元素的逆元。 因为 \(a \cdot a^{p - 2} \equiv 1\ (mod\ p)\)。但请注意,只有p为素数时,这种反转方法才成立。
将费马小定理的模数推广到任何整数模,即不一定为素数的模,就可以得到欧拉定理:
假设a和m都是整数,且\(gcd(a, m) = 1\),则有:
\]
这个定理对模数m适用,也适用于整数环\(Z_m\)内的所有整数。
RSA密码体系
该密码体系是目前最广泛使用的一种非对称密码方案,在实际中常用于以下几个方面:
- 数据小片段的加密,尤其用于密钥传输
- 数字签名,譬如Internet上的数字证书
这里必须要注意,RSA加密并不是为了取代对称密码,因为它非常慢。利用RSA通常是用于安全地交换对称密码体系中的密钥。所以RSA通常与对称密码一起使用。
RSA加密与解密
RSA的加密与解密都是在整数环\(Z_m\)内完成的,模计算发挥了核心作用。
使用公钥进行加密和使用密钥进行解密的方法可以表示为如下:
加密
给定公钥\((n, e) = k_{pub}\)和明文\(x\),则加密函数为:
\]
其中,\(x, y \in Z_n\)
解密
给定私钥\(d = k_{pr}\)及密文\(y\),则解密函数为:
\]
其中,\(x, y \in Z_n\)
RSA密码体制需求
- 由于攻击者可以得到公钥,所以,对于给定公钥值e和n,确定私钥d在计算上必须是不可行的。
- 由于x只是唯一地取决于模数n的大小,所以一次RSA加密的位数不能超过l,其中l指的是n的位长度。
- 计算\(x^e\ mod\ n\)和\(y^d\ mod\ n\)应该相对简单(快速计算长整数的指数方法)
- 给定一个n应该对应很多密钥/公钥对,否则,不可抵御暴力攻击
RSA密钥生成
- 选择两个大素数p和q
- 计算\(n = p \cdot q\)
- 计算\(\Phi(n) = (p - 1)(q - 1)\)
- 选择满足以下条件的公开指数, \(e \in \{1,2, \cdots , \Phi(n) - 1\}\) $$gcd(e, \Phi(n)) = 1$$
- 计算满足以下条件的私钥d $$d \cdot e \equiv 1\ mod\ \Phi(n)$$
RSA密码体制的更多相关文章
- 密码基础知识(2)以RSA为例说明加密、解密、签名、验签
密码基础知识(1)https://www.cnblogs.com/xdyixia/p/11528572.html 一.RSA加密简介 RSA加密是一种非对称加密.是由一对密钥来进行加解密的过程,分别称 ...
- 密码学笔记(5)——Rabin密码体制和语义安全性
一.Rabin密码体制 Rabin密码体制是RSA密码体制的一种,假定模数$n=pq$不能被分解,该类体制对于选择明文攻击是计算安全的.因此,Rabin密码体制提供了一个可证明安全的密码体制的例子:假 ...
- 密码学笔记(4)——RSA的其他攻击
上一篇详细分析了几种分解因子的算法,这是攻击RSA密码最为明显的算法,这一篇中我们考虑是否有不用分解模数n就可以解密RSA的密文的方法,这是因为前面也提到,当n比较大的时候进行分解成素数的乘积是非常困 ...
- 密码学笔记(2)——RSA密码
上一篇笔记中讲述了大量的代数知识,这一篇中我们看看如何将这些代数知识应用到RSA密码体制中. 一.公钥密码学简介 在经典密码学的研究模型中,我们根据已选择的秘钥K得到一条加密规则$e_{k}$和一条解 ...
- 转: 数字证书原理 https 完整过程解析
点评: 讲的非常的详细与全面,值得一看. 转: http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html 文中首先解释了加密解 ...
- [区块链|非对称加密] 对数字证书(CA认证)原理的回顾
摘要:文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的 ...
- 数字证书原理(ssl,https)
文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理, ...
- spring boot 添加整合ssl使得http变成https方法
1. https出现的背景:(1)都知道http传输协议是裸漏的,明文传输的,极易被黑客拦截,因此,(2)人们想出的使用加密,也就是 对称加密 例如aes,不过这个由于因为对称加密需要每个客户端和服务 ...
- 双向认证SSL原理
http://m.blog.chinaunix.net/uid-540802-id-3170984.html 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的 ...
随机推荐
- 让EFCore更疯狂些的扩展类库(二):查询缓存、分部sql、表名替换的策略配置
前言 上一篇介绍了扩展类库的功能简介,通过json文件配置sql语句 和 sql语句的直接执行,这篇开始说明sql配置的策略模块:策略管理器与各种策略的配置. 类库源码:github:https:// ...
- java中数组的排序,直接排序,冒泡排序,插入排序
1.直接排序: public static void selectSort(int[] arr) { for (int x = 0; x < arr.length - 1; x++) { for ...
- CodeForces 333A
Secrets Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- MyBatis 源码分析——介绍
笔者第一次接触跟MyBatis框架是在2009年未的时候.不过那个时候的他并不叫MyBatis,而是叫IBatis.2010年的时候改为现在的名字--MyBatis.这几年过去了,对于笔者来讲有一点陌 ...
- Linux 用键盘操作窗口
以下是我从各处搜集来的关于用键盘操作窗口信息,操作可能不是最简或者最好的,当然也可能不是最全的,以后遇到新的操作,我会即使添加,如果你有我没有列出的操作,希望你能提出,我可以加上! 我实验的操作系统是 ...
- java_JDBC字段对应
地址: http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/java.102/B19275-03/datacc.htm ...
- SQL SERVER运维日记--收缩数据库
一个小故事 某天,小王正在和HR妹妹闲聊,正HAPPY时,,突然收到系统告警消息,数据库磁盘被剩余空间500M,OMG,不行,磁盘快满了,要是业务要停了,,那就小王只能删库到跑路了,,, 先检查下,有 ...
- 关于ionic开发的一些总结(项目启动设置,app图标名称更改)
1.更改包名称 一般项目刚生成时,ionic会根据项目名称自动给你生成一个包名.要修改包名的话,在根目录的config配置文件中,<widget id="x.x.x"换成自己 ...
- DevExpreess汉化使用方法及汉化包
1.在程序入口加入代码: System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.Cultu ...
- 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题
一.问题分析 对于后台系统,相比大家都有所印象,知道其中的布局结构,如图: 在这种布局中我们需要将header,sidebar,footer分开,而且对于中间部分的content内容需要动态变化,即根 ...