非对称加密算法——RSA加密原理及数学推导

Posted 奔跑的Snail

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非对称加密算法——RSA加密原理及数学推导相关的知识,希望对你有一定的参考价值。

说明:原创不易,著作权仅归作者本人所有,转载请注明出处。

建议:建议阅读时间15min+。证明过程可能看着枯燥,需要动手。

一、  RSA是什么?

看到标题的第一瞬间,先想一下,RSA是什么呢?百度百科是这么说的:RSA是一种非对称的加密机制。是一种公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。是由该算法设计者“Rivest、Shamir、Adleman”的名字构成,(可能看之前还认识“RSA”三个字母,看完后迷糊了。下面将详细介绍。)

二、  密码学相关介绍

现如今流行的加密算法主要有三大类:对称加密算法、非对称加密算法以及哈希算法(确切的说哈希算法不算是加密算法,因为加密算法有加密和解密两个过程,而Hash算法是单向的,或者说是不可逆的,也是由于其单向,不容易解密,所以在实际中有很大的用途,比如熟知的MD5算法)。
在1976年以前,所有的加密方法都是同一种模式:即加密和解密使用同样的规则,这种做法被称为对称加密。使用相同的规则(专业化术语叫“密钥”),两次连续的对等加密运算后会回复原始文字,存在着较大的安全隐患。1976年两位美国计算机科学家提出了一种新的方式:在不传递密钥的情况下完成解密。这种方式被称为“迪菲赫尔曼(Diffie-Hellman)非对称加密算法”。下面内容主要围绕迪菲赫尔曼算法展开。

三、  RSA加密原理

下面开始进入正题,先说一下非对称加密(加密的是为了保护双方通信安全)的流程:假设甲乙双方要通信(甲方要发信息给乙方)需要三个步骤。
第一步 :乙方要先生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,而私钥则是保密的。
第二步 :甲方获取乙方的公钥,然后对其进行信息加密。
第三步 :乙方得到加密后的信息,用私钥来解密。
下面开始说RSA算法的原理。不过在了解原理之前先这里铺垫一些知识储备:
1、  知识储备
素数(质数) :只有1和它本身两个约数的数叫质数。(我记得小学课本中就是这么定义的,其实严格来说应该限制范围在自然数中)
互素(互质) :若N个整数的最大公约数是1,则称这N个整数互质。
模运算: 模是Mod的音译,是指数学中的求余运算。比如:8 mod 3 =2,即8对3取余为2。(注意:这里的模运算可千万别跟矩阵、向量中的模运算)
同余运算 :两个整数除以同一个正整数,余数相同,则称这两整数同余。比如8和11对3同余。
基础知识储备完了,接下来来看迪菲赫尔曼密钥交换。

2、  迪菲赫尔曼密钥交换

要知道,在非对称加密之前,人类都用的对称加密。所以密钥的传递就必须得异常小心。而且还存在着巨大的安全隐患。 所以后来的对称加密一出现便轰动了整个数学界(解决了密钥传递的保密性问题),而且非对称加密也对密码学的发展起着很大的作用。我们来看一下轰动数学界的发现:

隐藏

看完上图是不是感觉很神奇?看似不相关的计算,到最后双方获得的私钥居然是一致??别急,继续看,下面有详细的数学推导(注:上图中的13跟15是随机生成的,可任意。3和17可以用其他常数替换,本人借助代码验证见如下代码)
public class RSAValidate { //这里定义的3跟17可以任意更换 public static final int BASIC_NUMBER=3; public static final int MOD_NUMBER=17; public static void diffieHellman() { //通信双方各自生成两个随机数(为了方便理解,这里双方用客户端和服务器) int cRandom=(int)(Math.random()*100); int sRandom=(int)(Math.random()*100);  //客户端和服务器分别根据自己生成的随机数和计算规则计算出要传递给对方的公钥 int publicKeyToServer=(int)(Math.pow(BASIC_NUMBER, cRandom))%17; int publicKeyToCustom=(int)(Math.pow(BASIC_NUMBER, sRandom))%17;  //两边计算出密钥 int cPrivateKey=(int)(Math.pow(publicKeyToServer, cRandom))%17; int sPrivateKey=(int)(Math.pow(publicKeyToCustom, sRandom))%17;  //验证两端生成的密钥是否一致(经验证:一致) System.out.println(cPrivateKey==sPrivateKey); } public static void main(String[] args) { RSAValidate.diffieHellman(); }}
看完以上内容,迪菲赫尔曼的流程就了解了。那么关于迪菲赫尔曼的最后一个问题:看似不相关的计算,为什么两边形成的密钥是一致的呢?下面将进行数学证明:
3、    概括 上述过程:
对于客户端: 3 mod 17=a (a就是客户端形成的公钥),传递给服务器。
对于服务器: 3 mod 17=b(b就是服务器形成的公钥),传递给客户端。
bm mod 17= an mod 17 (两边形成的密钥一致);

证明方法一:

上述过程可转化为如下数学问题:
已知:    非对称加密算法——RSA加密原理及数学推导  求证:bm mod 17= an mod 17 
证明:an mod 17 
=(3m mod 17)n mod 17
=3mn mod 17 (上一步到这一步是取模运算法则)
bm mod 17
=(3n mod 17 )m mod 17
=3nm mod 17    上一步到这一步是取模运算法则)
=an mod 17     证明完毕!
这里先买个关子,去模运算法则在看完证明方法二之后证明:

证明方法二:

由同余定理(同余定理:给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m))上述过程可转化为如下数学问题:
已知:   求证 : an-bm=17k。(说明:s,t,k 属于正整数)
证明:由已知条件得:
所以:
an-bm
=(3m-17s)n-(3n-17t)m
=3mn-3nm+17k   (根据牛顿二项式定理)
=17k        证明完毕!

证明取模运算法则:am mod p= (a mod p)mod p

以上运算法则转化得: am [(a modp)]mod p。即证明am(a mod p)m同余p
证明:由同余定理(同余定理:给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m))得证明: a-(a mod p) =pk(k属于正整数)即可;
根据公式: an-bn=(a-b)(……)得原式=(a-(a mod p))*(……);
因为a-(a mod p) 是p的倍数,而“*”后面是常数。
所以a-(a mod p)m  是p的倍数。(如果m是p的倍数,C是常数,那么mC一定是p的倍数)。得证!


以上就是RSA的数学原理。原创不易,求多多关注~~~









以上是关于非对称加密算法——RSA加密原理及数学推导的主要内容,如果未能解决你的问题,请参考以下文章

非对称加密技术- RSA算法数学原理分析

非对称加密技术- RSA算法数学原理分析

非对称加密及RSA加密算法

rsa加密算法及js的JSEncrypt实现前端加密

原创 | 信息安全传递的战争—浅析从对称加密到RSA非对称加密的数学原理

RSA加密算法原理