RSA 介绍
RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA 被广泛使用。RSA 是 1977 年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。RSA 就是他们三人姓氏开头字母拼在一起组成的。
RSA 算法的可靠性由极大整数因数分解的难度决定。换言之,对一极大整数做因数分解愈困难,RSA 算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。如今,只有短的 RSA 密钥才可能被强力方式解破。到 2017 年为止,还没有任何可靠的攻击 RSA 算法的方式。
基本原理
公钥与私钥的产生
随机选择两个不同大质数 $p$ 和 $q$,计算 $N = p \times q$
根据欧拉函数,求得 $\varphi (N)=\varphi (p)\varphi (q)=(p-1)(q-1)$
选择一个小于 $\varphi (N)$ 的整数 $e$,使 $e$ 和 $\varphi (N)$ 互质。并求得 $e$ 关于 $\varphi (N)$ 的模反元素,命名为 $d$,有 $ed\equiv 1 \pmod {\varphi (N)}$
将 $p$ 和 $q$ 的记录销毁
此时,$(N,e)$ 是公钥,$(N,d)$ 是私钥。
消息加密
首先需要将消息 以一个双方约定好的格式转化为一个小于 $N$,且与 $N$ 互质的整数 $m$。如果消息太长,可以将消息分为几段,这也就是我们所说的块加密,后对于每一部分利用如下公式加密:
消息解密
利用密钥 $d$ 进行解密。
正确性证明
即我们要证$m^{ed} \equiv m \bmod N$,已知$ed \equiv 1 \bmod \phi(N)$,那么 $ed=k\phi(N)+1$,即需要证明
这里我们分两种情况证明
第一种情况 $gcd(m,N)=1$,那么 $m^{\phi(N)} \equiv 1 \bmod N$,因此原式成立。
第二种情况 $gcd(m,N)\neq 1$,那么 $m$ 必然是 $p$ 或者 $q$ 的倍数,并且 $n=m$ 小于 $N$。我们假设
那么 $x$ 必然小于 $q$,又由于 $q$ 是素数。那么
进而
那么
进而
所以原式成立。
基本工具
RSAtool
安装
生成私钥
RSA Converter
根据给定密钥对,生成 pem 文件
根据 $n$,$e$,$d$ 得出 $p$,$q$
openssl
查看公钥文件
解密
更加具体的细节请参考 openssl --help。
分解整数工具
网站分解,factor.db
命令行分解,factordb-pycli,借用 factordb 数据库。
python 库
primefac
整数分解库,包含了很多整数分解的算法。
gmpy
gmpy.root(a, b),返回一个元组(x, y),其中x为a开b次方的值,y是判断x是否为整数的布尔型变量
gmpy2
安装时,可能会需要自己另行安装 mpfr 与 mpc 库。
gmpy2.iroot(a, b),类似于gmpy.root(a,b)
pycrypto
安装
使用
Jarvis OJ - Basic - veryeasyRSA
p = 3487583947589437589237958723892346254777 q = 8767867843568934765983476584376578389
e = 65537
求 d =
请提交
PCTF{d}
直接根据 $ed\equiv 1 \pmod{\varphi (N)}$,其中 $\varphi (N)=\varphi (p)\varphi (q)=(p-1)(q-1)$,可得 $d$。
2018 CodeGate CTF Rsababy
程序就是一个简单的 RSA,不过程序还生成了两个奇怪的数
所以,问题应该出自这里,所以我们就从此下手,不放这里先假设 const = 0xdeadbeef。那么
进而,根据 RSA 可知
所以
而与此同时根据费马小定理,我们知道
所以
进而
所以
因此,代码如下
2018 国家安全周 pure math
题目的基本描述是这个样子的
我们的目的基本上就是求得 FLAG,那么怎么做呢?这个题目需要我们具有较好的数论功底。
根据题目中这样的内容,我们可以假设 $p$,$q$ 都是大素数,那么
$p^{q-1} \equiv 1\bmod q$
那么
$p^{q} \equiv p \bmod pq$
那么我们可以根据 3)知道
$p^q+q^p \equiv p+q \bmod pq$
而 $p+q$ 又显然小于 $pq$,所以我们就知道 $p+q$ 的数值。
进一步,我们假设1),2),3),4),5)对应的值分别为 $x_1$, $x_2$, $x_3$, $x_4$, $x_5$ 则
根据4),我们可以知道
$(p+q)^{p+q} \equiv p^{p+q}+q^{p+q} \bmod pq$
又因为1)和 2),则
$p^pp \equiv px_1\bmod pq$
$q^qq \equiv qx_2 \bmod pq$
因此
$px_1+qx_2 \equiv x_4 \bmod pq$
根据 $x_1$ 和 $x_2$ 的求得方式,我们可以知道这里也是等号,因此我们得到了一个二元一次方程组,直接求解即可。
flag 如下
2018 Pwnhub LHY
首先分析这段代码
由于 gmpy.is_prime 要么返回1,要么返回 0,所以我们可以很容易地试出来 y 是素数,x+1 也是素数,并且
$(x^2-1)^2\equiv 0 \bmod (2xy-1)$
为了式子能够整除,猜测 $x=2y$ 。
于是,对于下面的内容
$p$ 和 $q$ 自然为
$p=next_prime(9y^3)$
$q=next_prime(6y^3)$
根据素数的间隔,可以知道 $p$ 和 $q$ 最多比括号里的数字大一点,这里一般不会超过 $1000$。
那么
$n \geq 54y^6$
所以我们知道了 $y$ 的上界,而对于 $y$ 的下界其实也不会离上界太远,我们大概减个几十万。进而,我们利用二分查找的方式来寻找 $p$ 和 $q$,如下
Last updated