关于RSA的基础过程介绍

下文中的 k 代表自然数常数,不同句子,公式中不一定代表同一个数

之前接触RSA,没有过多的思考证明过程,今天有感而发,推到了一遍

假设公钥 (e, N) , 私钥 (d, N) ,那么 ed =  k * g (N) + 1 , g是欧拉函数,假设 N = p * q ,p 和 q 都是 大素数, 那么 g (N) = ( p - 1 ) * ( q - 1 ) , k 是自然数

假设明文是 M , 那么 密文 C = M ^ e (mod N)

密文再次运算的结果是明文,即使明文 R = C ^ d ( mod N ) = ( M ^ e ) ^ d ( mod N ) = M ^ (ed) (mod N)

最后 明文 R = M ^ (ed) (mod N) = M ^ ( k * g(N) + 1 ) ( mod N )

要从 R 推出明文,就要证明 R 和 明文 M 模N 同余,也就是 R = k * N + M (k 为自然数)

很简单的一种情况是 明文 M 和 N 是互质的,因为根据欧拉定理 :

如果 下图的 a 和 n 互质,则有

如果 M 和 N 互质,则两边乘 M

  M ^ ( k * g(N)) 1 (mod N )     =》 [ M ^ ( k * g(N)) ] * [ M ] = M ^ ( k * g(N) + 1 )  = R M ( mod N )

如果 M 和 N 不是互质,就比较难证明了

M 和 N 不互质,那么 M 和 N 必然有一个非1的公因子 , 假设为 g , 则 N = k1 * g , M = k2 * g (k1, k2 均是常数)

 两个素数相乘的积,只有四个因子,分别是 两个乘起来的素数,1,还有积本身。

 那么 g 就应该是 这四个因子中的一个,前提已经假设 g 非1,那么 g 可能是剩下三个中的一个。

 但是根据 RSA 规范:

 5.1.1RSAEP

  RSAEP ((n, e), m)

  Input: (n, e) RSA public key

  m message representative, an integer between 0 and n– 1

  Output: c ciphertext representative, an integer between 0 and n– 1

 M 应该小于 N,那么 g 就不能取 N,否则 M =  k * g = k * N > N 

 在当前上下文,N = p * q ,  p 和 q 就是 那两个大素数, N 就是乘积,那么 g 就应该是 p 或 q ,可以推出 M = k0 * g = k * q 或者 M = k * p  (k0,k 是自然数)

(g是M和N的非1公因子,所以可以写成 M = k0 * g 的形式)

 因为 M < N , 假如 M = k * p , 那么 k = M / p < N / p = q ,也即 k < q ,那么 k 必然和 q 互质,因为 q 是素数 (原因见下图)。M = k * q 时同理

(k 和 q) 与 p 都互质,则有 k * q 与 p 互质。(因为 q 是素数,那么 k * q 分解的话只能分解出 k 和 q,必然没有 p 的因子,下同理)

或者  (k 和 p) 与 q 都互质,则有 k * p 与 q 互质。

再用一次欧拉定理,下面假设 M = k * p

  (k * p) ^ (g(q)) 1 (mod q)

  因为 q 是素数,比 q 小的数都和 q 互质,所以有 q - 1 个数 和 q 互质,也就是 q 的欧拉函数运算结果 g (q) = q - 1

也就是:

  (k * p) ^ (q - 1) 1 (mod q)

 下面还要用到一个推到:

  假如 A 1 (mod q)  (公式1),那么 ( A ) ^ h 1 (mod q) (公式2)

  推到: 由公式1得到 A = k * q + 1 , 将 A 代入公式2, ( k * q + 1 ) ^ h 在展开后,只有最后一项是1,不带 k * q,其他都带 k * q , 所以 A^h = ( k * q + 1 ) ^ h 在 mod q 之后还是等于1

  所以公式2成立

 把 A 换成 (k * p) ^ (q - 1) , h 换成 k0 * (p - 1)

 (k * p) ^ (q - 1) 1 (mod q)  

可以转化成

 [ ( k * p ) ^ ( q - 1) ] ^ ( k0 * ( p - 1 )) 1 (mod q)

 [ ( k * p ) ] ^ [ k0 * ( q - 1) * ( p - 1 )] 1 (mod q)

 根据 ed = i * g(N) + 1 = i * (p - 1) * (q - 1) + 1

 [ ( k * p ) ] ^ (ed - 1) 1 (mod q)

 两边同乘 k * p

 [ ( k * p ) ] ^ (ed) (k * p) (mod q)

可以写成:

 [ ( k * p ) ] ^ (ed) = (k * p) + k1 * q (k1 是自然数常数)

那么

[ ( k )  ^ (ed) ] * [ p ^ (ed ) ] = (k * p) + k1 * q

[ ( k )  ^ (ed) ] * [ p ^ (ed ) ] - k * p = k1 * q

 [ [ (k) ^ (ed) ] * [ p ^ (ed - 1) ] - k ] * p = k1 * q

 左边是 p 的倍数,右边应该也是 p 的倍数,又 p 和 q 互质,那么只能 k1 是 p 的倍数

 回到之前的公式,把 k1 = k2 * p 代入

 [ ( k * p ) ] ^ (ed) = (k * p) + k1 * q   =》    [ ( k * p ) ] ^ (ed) = (k * p) + k2 * p * q

 因为 N = p * q,继续代入

 [ ( k * p ) ] ^ (ed) = (k * p) + k2 * N

[ ( k * p ) ] ^ (ed)   ( mod N ) = [(k * p) + k2 * N ] (mod N) = (k * p) (mod N)

 M = k * p 也就是

 M ^ (ed) (Mod N) = M (mod N)

 也就是 M ^ (ed) 和 M 模 N 同余

也即,R = M ^ (ed) 和 M 同余

 证毕

证明RSA算法在明文和公私钥中N不互质情况下仍然成立的更多相关文章

  1. RSA算法求明文

    #注:gmpy2 的安装请参考 http://www.cnblogs.com/gwind/p/8000570.html# -*- coding: utf-8 -*- import gmpy2 prin ...

  2. [转]应用RSACryptoServiceProvider类轻松实现RSA算法

    在我们现实当中经常会存在需要对某些数据进行加密保护 然后进行解密的操作,比方,我们需要对某些XML配置信息里面的某些数据进行加密,以防止任何人打开该XML配置信息都能正常的看到该配置信息里面的内容,从 ...

  3. 实现 RSA 算法之基础公式证明(第一章)(老物)

    写这篇日志是拖了很久的事情,以前说要写些算法相关的文章给想学信息安全学(简称信安),密码学的同学提供些入门资料,毕竟这种知识教师上课也不会细讲太多(纯理论偏重),更不用说理解和应用了,说到RSA公钥( ...

  4. RSA算法详解

    1.RSA加密算法是最常用的非对称加密算法 2.RSARSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名, 3.目前学术界无法证明RS ...

  5. 加密算法——RSA算法(c++简单实现)

    RSA算法原理转自:https://www.cnblogs.com/idreamo/p/9411265.html C++代码实现部分为本文新加 RSA算法简介 RSA是最流行的非对称加密算法之一.也被 ...

  6. RSA算法之学习

    一.RSA算法 RSA是非对称加密算法中的代表,它的重要性不言而喻,为了弄清楚RSA算法,我们一起来完成一项任务: 背景:现在是疫情时代,假如小明和女朋友被迫在两个城市,小明为了表达感情,想发给对方一 ...

  7. 跨越千年的RSA算法

    转载自http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...

  8. (转)RSA算法原理(二)

      作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解 ...

  9. RSA算法 Android JAVA C#互通

    RSA算法属非对称加密算法,在实际使用中,往往客户端使用公钥进行加密传递敏感数据,服务端server使用私钥进行解密,这样防止中间人从网络获取敏感数据的明文. Android端主要代码如下: pack ...

随机推荐

  1. unity3d插入android有米广告

    有米官网:http://www.youmi.net/register?r=MTI0MDg= 国内的广告,我觉得万普和有米还不错,我也只试了这两个,其他的都是看评价的,呵呵~~~首先我们去有米官网注册一 ...

  2. RTS寻路算法

    https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html https://www.zhihu.com/question/2 ...

  3. Rng(求逆元)

    Problem Description Avin is studying how to synthesize data. Given an integer n, he constructs an in ...

  4. sort(桶排序+hash)

    题目链接:https://cn.vjudge.net/problem/HDU-1425 注意是多组输入 代码: #include<cstdio> #include<iostream& ...

  5. 我竟然才知道slf4j里还有个MDC

    大家好久不见,我是walking.今天给大家带来一个日志方面的知识——MDC,不知道大家认识不,反正我是最近刚知道的 初见MDC 前两天看项目中的代码,无意中看到一个自定义的线程池 MDCThread ...

  6. 1.异常页面: /File/ApplyFileForm.aspx 2.异常信息: 基类包括字段“PageOfficeCtrl1”,但其类型(PageOffice.PageOfficeCtrl)与控件(PageOffice.PageOfficeCtrl)的类型不兼容。

    出现页面报错的解决如下: 1.  在  .aspx  页面报错的字段  ID 名称更改: 2.  在没有重复 ID控件,先实行步骤1, 生成项目是ok的,然后,还原,原来的ID名称,再去浏览页面运行, ...

  7. Opencv+Yolov3算法实现社交距离安全检测讲解和实战(Social Distance Detector)

    在我们进行交流谈话时,人与人之间总要保持一定的距离,尤其是在疫情的情况下,人与人之间更要保持一定的安全距离,今天给大家来介绍一个检测社交距离的项目,实现社交距离检测器. 社交距离(Social Dis ...

  8. 第11课 - enum, sizeof, typedef 分析

    第11课 - enum, sizeof, typedef 分析 1. enum介绍 (1)enum是C语言中的一种自定义类型,和struct.union地位相同,格式如下: // enum每个值的最后 ...

  9. SSO单点登录可以自己实现吗?--开源软件诞生10

    ERP与SSO的恩怨情仇--第10篇 用日志记录“开源软件”的诞生 赤龙 ERP 开源地址: 点亮星标,感谢支持,与开发者交流 kzca2000 码云:https://gitee.com/redrag ...

  10. MiniJpegDecoder使用介绍

    承接昨天写的<JPEG软解码实现介绍>,今天介绍其使用方法和一些细节说明. 1.仓库下已经包含了几个jpeg文件,以方便直接校验. 2.使用命令分为两种模式. 一种是直接解码为yuv文件, ...