数学概念
同余定理
如果两个数 a、b,模上某个数 p,得到的余数相同,则 a 和 b 同余,记作:
a≡b(modp)
例如:
37≡3(mod17)
5≡22(mod17)
≡ 和 = 非常相近,左右相等的式子可以变换相加、相减、相乘、相除,如下例子 :
又如:
∵
37≡3(mod7)
5≡22(mod17)
∴
5×37≡22×3(mod17)
这样做的好处,是能够将一个非常大的数字变成一个限定范围内的数字,简化运算。例如以下计算:
可以分步为:
=>
5×4≡3(mod17)
=>
3×13≡5(mod17)
=>
3×13×5×4≡5×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)=(p−1)(q−1)=16×22=352
欧拉定理
若 p ,
a 为正整数,且 p ,a 互质,则:
aφ(p)≡1(modp)
如果 a = 4,p = 17,则 4φ(17)≡1(mod17) ,使用 python 验证,由于 φ(17) = 16,则:
模反元素
如果两个正整数
a
和
例如:
3 和 5 互质,那么 3 的模反元素就是 7,因为
(3×7)(mod7)=1。
RSA 操作与原理
RSA 有关参数
P:明文 C:密文 两个质数p、q : N = p * q e:公钥 d:私钥
生成私钥的过程
随机选定两个大质数 p ,
q 计算 N=p×q
计算 φ(N)=(p−1)(q−1)
选取正整数 e ,满足 1 <
e < φ(N) , 且 e 与φ(N) 互质计算 e 的模反元素
d ,其中, e 、d 、 N 之间的关系如下:
e×d≡1(modφ(N))
于是就得到公钥 (e,n) 私钥 (d,n)
加密过程
解密过程
例 :
假设
P
= 5,
=> N=p×q=391
=> 47×d≡1(modφ(391))
由此得出 d = 15
加密解密验证
=>
=> P=19415(mod391)=5
公式推导
根据
Pe≡C(modN)
=>
Cd(modN)=(Pe)d(modN)
=>
(Pe)d(modN)=Pe×d(modN)
根据
e×d≡1(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)×r≡1(modN)
=>
P×Pφ(N)×r(modN)=P
RSATool 使用
Factor N
在 Modulus(N) 中输入一个数,点击 Factor N,可以对这个数进行因式分解。
Calc. D
根据公式: e×d≡1(modφ(N)) ,计算出 D 。
E 是可以随便为一个数,一般都是 10001h。另外,常说的 RSA 有多少位,指的是 N 有多少位。
程序练习
程序逻辑
用 ida 打开程序,在 main 函数里可以看到一长串的数字,该数字是
启动程序,要求输入 username 和 vericode。程序会根据输入的 username 生成一个公钥
e
。然后根据
如果解密后的结果和 CheckOk 相等,那么解密成功。
破解思路
程序中的的明文实际上为 0x6B6F006B4F6B63656843(即 Check.ok)。但是由于该程序是比较字符串 CheckOk,也就是说,只检查了 橘色 部分,前面的2个字节的并没有比较,这是该程序的 疏漏之处。
在Username中输入 keep 后,打开 OD 在 0x004015DF 下断点, edx 处的地址,是
e
(为什么这是
RSA算法中一般都会使用大数运算,蓝框内显示的是数字的总字节数;红框内的数字从左往右数,为 0x6408FCD6289E9A7A1750886EB8198697。
我们已经得到了
e
、
由于该程序中的
e 和 d 必须是质数,且满足以下公式:
e×d≡1(modφ(N))
但有时得出的 e 和d 并不能满足以上公式。该程序的处理,是通过将 e 加 1 的方式,直到以上公式满足条件为止。
既然知道了