RSA 算法笔记

数学概念

同余定理

如果两个数 a、b,模上某个数 p,得到的余数相同,则 a 和 b 同余,记作:

ab(modp)

例如:

373(mod17)
522(mod17)


= 非常相近,左右相等的式子可以变换相加、相减、相乘、相除,如下例子 :

5×3722×37(mod17)

又如:


373(mod7)
522(mod17)


5×3722×3(mod17)


这样做的好处,是能够将一个非常大的数字变成一个限定范围内的数字,简化运算。例如以下计算:

5×4× 13(mod17)

可以分步为:

=> 5×43(mod17)
=> 3×135(mod17)
=> 3×13×5×45×3(mod17)


欧拉函数

在 [1 , n) 中,与 n 互质的正整数的个数,用 φ(n) 表示

互质,指的是公约数只有 1 的两个整数–>互质百科传送门

例如:

φ(7) = { 1, 2, 3, 4, 5 ,6 } = 6
φ(10) = { 1, 3, 7, 9 } = 4

又如 p 和 q 都是质数:

p = 17,q = 23
φ(N)=φ(p×q)=φ(p)×φ(q)=(p1)q1=16×22=352


欧拉定理

p a 为正整数,且 p a 互质,则:

aφ(p)1(modp)

如果 a = 4,p = 17,则 4φ(17)1(mod17) ,使用 python 验证,由于 φ(17) = 16,则:

这里写图片描述


模反元素

如果两个正整数 a n 互质,那么一定可以找到整数 b ,使得 a×b(modn)=1。这时, b 就叫做 a 的“模反元素”。

例如:
3 和 5 互质,那么 3 的模反元素就是 7,因为 3×7(mod7)=1


RSA 操作与原理

RSA 有关参数

P:明文
C:密文
两个质数p、q : N = p * q
e:公钥
d:私钥

生成私钥的过程

  1. 随机选定两个大质数 p q

  2. 计算 N=p×q

  3. 计算 φ(N)=(p1)(q1)

  4. 选取正整数 e ,满足 1 < e < φ(N) , 且 e φ(N) 互质

  5. 计算 e 的模反元素 d ,其中, e d N 之间的关系如下:

    e×d1(modφ(N))

于是就得到公钥 en 私钥 dn


加密过程

PeC(modN)


解密过程

CdP(modN)


例 :

假设 P = 5,p = 17, q = 23,e = 47 根据上面的公式推导出:

=> N=p×q=391

=> 47×d1(modφ(391))

由此得出 d = 15

这里写图片描述


加密解密验证

=> C=547(modN)=194

=> P=19415(mod391)=5

这里写图片描述

公式推导

根据 PeC(modN)
=> Cd(modN)=(Pe)d(modN)
=> (Pe)d(modN)=Pe×d(modN)

根据 e×d1(modφ(N))
=> Pe×d(modN)=Pφ(N)×r+1(modN)
=> Pφ(N)×r+1(modN)=P×Pφ(N)×r(modN)

根据欧拉定理 aφ(p)1(modp)
=> Pφ(N)×r1(modN)
=> P×Pφ(N)×r(modN)=P


RSATool 使用

这里写图片描述

Factor N

在 Modulus(N) 中输入一个数,点击 Factor N,可以对这个数进行因式分解。

这里写图片描述

Calc. D

根据公式: e×d1(modφ(N)) ,计算出 D

这里写图片描述

E 是可以随便为一个数,一般都是 10001h。另外,常说的 RSA 有多少位,指的是 N 有多少位。


程序练习

–>程序下载(带大数运算工具及 RSATool)

程序逻辑

用 ida 打开程序,在 main 函数里可以看到一长串的数字,该数字是 N = 0x8E62759770E926131A4044B7C457C9F1

这里写图片描述

启动程序,要求输入 username 和 vericode。程序会根据输入的 username 生成一个公钥 e 。然后根据 e N d 的关系,生成密钥 d 。再用密钥 d 对输入的 vericode(相当于密文)解密。

这里写图片描述

如果解密后的结果和 CheckOk 相等,那么解密成功。

这里写图片描述


破解思路

程序中的的明文实际上为 0x6B6F006B4F6B63656843(即 Check.ok)。但是由于该程序是比较字符串 CheckOk,也就是说,只检查了 橘色 部分,前面的2个字节的并没有比较,这是该程序的 疏漏之处

在Username中输入 keep 后,打开 OD 在 0x004015DF 下断点, edx 处的地址,是 e (为什么这是 e,迷失了…T T)。

RSA算法中一般都会使用大数运算,蓝框内显示的是数字的总字节数;红框内的数字从左往右数,为 0x6408FCD6289E9A7A1750886EB8198697。

这里写图片描述

我们已经得到了 e N,于是可以使用 RSATool 可以计算出 d

由于该程序中的 e d 必须是质数,且满足以下公式:

e×d1(modφ(N))

但有时得出的 e d 并不能满足以上公式。该程序的处理,是通过将 e 加 1 的方式,直到以上公式满足条件为止。

这里写图片描述

既然知道了 P e <script type="math/tex" id="MathJax-Element-231">e</script>,即可得出密文(即vericode):

这里写图片描述

这里写图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页