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