CTFcrypto
Last Update:
Word Count:
Read Time:
Page View: loading...
栅栏密码
栅栏密码把要加密的明文分成 N 个一组,然后把每组的第 1 个字连起来,形成一段无规律的话。
1 |
|
去掉空格后变为
1 |
|
分成两栏,两个一组得到
1 |
|
先取出第一个字母,再取出第二个字母
1 |
|
连在一起就是
1 |
|
上述明文也可以分为 2 栏。
1 |
|
组合得到密文
1 |
|
摩斯密码
培根密码
培根密码使用两种不同的字体,代表 A 和 B,结合加密表进行加解密。
a | AAAAA | g | AABBA | n | ABBAA | t | BAABA |
---|---|---|---|---|---|---|---|
b | AAAAB | h | AABBB | o | ABBAB | u-v | BAABB |
c | AAABA | i-j | ABAAA | p | ABBBA | w | BABAA |
d | AAABB | k | ABAAB | q | ABBBB | x | BABAB |
e | AABAA | l | ABABA | r | BAAAA | y | BABBA |
f | AABAB | m | ABABB | s | BAAAB | z | BABBB |
上面的是常用的加密表。还有另外的一种加密表,可认为是将 26 个字母从 0 到 25 排序,以二进制表示,A 代表 0,B 代表 1。
下面这一段内容就是明文 steganography 加密后的内容,正常字体是 A,粗体是 B:
To encode a message each letter of the plaintext is replaced by a group of five of the letters ‘A’ or ‘B’.
可以看到,培根密码主要有以下特点
- 只有两种字符
- 每一段的长度为 5
- 加密内容会有特殊的字体之分,亦或者大小写之分。
Base 编码 ¶
base xx 中的 xx 表示的是采用多少个字符进行编码,比如说 base64 就是采用以下 64 个字符编码,由于 2 的 6 次方等于 64,所以每 6 个比特为一个单元,对应某个可打印字符。3 个字节就有 24 个比特,对应于 4 个 Base64 单元,即 3 个字节需要用 4 个可打印字符来表示。它可用来作为电子邮件的传输编码。在 Base64 中的可打印字符包括字母 A-Z、a-z、数字 0-9,这样共有 62 个字符,此外两个可打印符号在不同的系统中而不同。
JSfuck
JSFuck 是一种基于 JavaScript 原子部分的深奥和教育性的编程风格。它仅使用六个不同的字符来编写和执行代码。
它不依赖于浏览器,因此您甚至可以在 Node.js 上运行它。
基本
1 |
|
完整列表:jsfuck/jsfuck.js at master · aemkei/jsfuck · GitHub
可在浏览器控制台运行。
AAEncode
http://www.atoolbox.net/Tool.php?Id=703
Rabbit
http://www.jsons.cn/rabbitencrypt/
Ook 编码
[Brainfuck/Ook! Obfuscation/Encoding splitbrain.org]
Brainfuck 解释器
[Brainfuck/Ook! Obfuscation/Encoding splitbrain.org]
Serpent 加密
http://serpent.online-domain-tools.com/
可以用 ARCHPR 暴力破解压缩包
Quoted-printable 编码
一堆等号连接的 16 进制数对 -Quoted-printable 编码
http://web.chacuo.net/charsetquotedprintable
MD5 碰撞
MD5 是什么
MD5 信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个 128 位(16[字节] 的散列值(hash value)),用于确保信息传输完整一致。MD5 由美国密码学家 [罗纳德·李维斯特](Ronald Linn Rivest)设计,于 1992 年公开,用以取代[MD4] 算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996 年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如 [SHA-2]。2004 年,证实 MD5 算法无法防止碰撞,因此不适用于安全性认证,如[SSL] 公开密钥认证或是 [数字签名] 等用途。
MD5 碰撞原理简单介绍及其实现 - wysng - 博客园 (cnblogs.com)
URL 解码
RSA
RSA 算法
密钥生成的步骤
我们通过一个例子,来理解 RSA 算法。假设爱丽丝要与鲍勃进行加密通信,她该怎么生成公钥和私钥呢?
第一步,随机选择两个不相等的质数 p 和 q。
爱丽丝选择了 61 和 53。(实际应用中,这两个质数越大,就越难破解。)
第二步,计算 p 和 q 的乘积 n。
爱丽丝就把 61 和 53 相乘。
n = 61×53 = 3233
n 的长度就是密钥长度。3233 写成二进制是 110010100001,一共有 12 位,所以这个密钥就是 12 位。实际应用中,RSA 密钥一般是 1024 位,重要场合则为 2048 位。
第三步,计算 n 的欧拉函数φ(n)。
n 是质数,则 φ(n)=n-1
n = p1 × p2
φ(n) = φ(p1p2) = φ(p1)φ(p2)
=> φ(n) = (p-1)(q-1)
爱丽丝算出φ(3233)等于 60×52,即 3120。
第四步,随机选择一个整数 e,条件是 1< e < φ(n),且 e 与φ(n) 互质。
爱丽丝就在 1 到 3120 之间,随机选择了 17。(实际应用中,常常选择 65537。)
第五步,计算 e 对于φ(n)的模反元素 d。
所谓”模反元素”就是指有一个整数 d,可以使得 ed 被φ(n)除的余数为 1。
ed ≡ 1 (mod φ(n))
这个式子等价于
ed - 1 = kφ(n)
于是,找到模反元素 d,实质上就是对下面这个二元一次方程求解。(-k = y)
ex + φ(n)y = 1
已知 e=17, φ(n)=3120,
17x + 3120y = 1
这个方程可以用 “扩展欧几里得算法”(又叫辗转相除法) 求解,此处省略具体过程。总之,爱丽丝算出一组整数解为 (x,y)=(2753,-15),即 d=2753。
至此所有计算完成。
第六步,将 n 和 e 封装成公钥,n 和 d 封装成私钥。
在爱丽丝的例子中,n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)。
实际应用中,公钥和私钥的数据都采用 ASN.1 格式表达。
RSA 算法的加密和解密
有了公钥和密钥,就能进行加密和解密了。
(1)加密要用公钥(n,e)
假设鲍勃要向爱丽丝发送加密信息 m,他就要用爱丽丝的公钥 (n,e) 对 m 进行加密。这里需要注意,m 必须是整数(字符串可以取 ascii 值或 unicode 值),且 m 必须小于 n。
所谓”加密”,就是算出下式的 c:
me ≡ c (mod n)
爱丽丝的公钥是 (3233, 17),鲍勃的 m 假设是 65,那么可以算出下面的等式:
65^17 ≡ 2790 (mod 3233)
于是,c 等于 2790,鲍勃就把 2790 发给了爱丽丝。
(2)解密要用私钥(n,d)
爱丽丝拿到鲍勃发来的 2790 以后,就用自己的私钥(3233, 2753) 进行解密。可以证明,下面的等式一定成立:
cd ≡ m (mod n)
也就是说,c 的 d 次方除以 n 的余数为 m。现在,c 等于 2790,私钥是(3233, 2753),那么,爱丽丝算出
2790^2753 ≡ 65 (mod 3233)
因此,爱丽丝知道了鲍勃加密前的原文就是 65。
至此,”加密–解密”的整个过程全部完成。
我们可以看到,如果不知道 d,就没有办法从 c 求出 m。而前面已经说过,要知道 d 就必须分解 n,这是极难做到的,所以 RSA 算法保证了通信安全。
你可能会问,公钥(n,e) 只能加密小于 n 的整数 m,那么如果要加密大于 n 的整数,该怎么办?有两种解决方法:一种是把长信息分割成若干段短消息,每段分别加密;另一种是先选择一种”对称性加密算法”(比如DES),用这种算法的密钥加密信息,再用 RSA 公钥加密 DES 密钥。
(71 条消息) RSA 加密算法_gao131360144 的博客 -CSDN 博客_rsa 加密算法
依赖库:
- gmpy2
- pycrypto
RSA 原理
私钥 n,d,公钥 n,e。其中 n 是两个素数 p,q 的乘积。c 为密文,m 为明文。φ(n)为欧拉函数。其中:d 是 e 模φ(n)的逆元。我们有φ(n)=(p−1)(q−1)
ed≡1modφ(n)
encrypt:c≡memodn
decrypt:m≡cdmodn
openssl 使用
使用 openssl
查看 pem
文件:
1 |
|
使用 openssl
和私钥解密
1 |
|
常规
场景
已知 p、q、c
解法
求φ(n),再求出 d 即可
1 |
|
模不互素
场景
已知如下:
n1=p×q1
n2=p×q2
c1=memodn1
c2=memodn2
解法
求出 n1 和 n2 的公因子,即可解得 p 和 q
1 |
|
共模攻击
场景
模数 n 相同,指数、e1、e2 不同且互质
已知:
c1=me1modn
c2=me2modn
解法
根据扩展欧几里得算法求出 re1+se2=1modn 的整数、r、s
根据
(1)c1rc2s≡mre1mse2modn≡mmodn 得到明文
1 |
|
e 小指数攻击
场景
当 e 很小的时候,例如 2、3,此时可能可以通过直接暴力开根的方式进行攻击
解法
以 e=3 为例,已知 c≡m3modn,因此有:m3=c+kN
m=c+kN3
1 |
|
Rabin 攻击
场景
当指数 e=2,且已知 p 和 q
解法
计算
mp=c2modp
mq=c2modq
扩展欧几里得求 yp 和 yq
ypp+yqq=1
解得 4 个明文
a=(yp⋅p⋅mq+yq⋅q⋅mp)modn
b=n−a
c=(yp⋅p⋅mq−yq⋅q⋅mp)modn
d=n−c
条件:当 p≡q≡3mod4 时,有
mp=c(p+1)/4modp
mq=c(q+1)/4modq
满足条件时
1 |
|
不满足条件时
转换为模平方根问题
- 用 python(代码来自 yuri)
1 |
|
- 用 sage
使用一句话 Mod(c_square, q).sqrt(all=True)
分别求出 mp 和 mq,代回去解得可能的明文
n 分解攻击
当 n 很小或者满足一定条件时,可以进行暴力分解
- yafu
- factordb
- 当 d<1/3N1/4 时,通过 Wiener’s attack 能够攻击得到 d
- 当、p、q 十分接近时,可以使用费马分解分解 n
- 当 q 较小,即 |p−q| 较大时,可以爆破 q
- 当 d<N0.292 时,通过 Boneh Durfee Method 分解 n
广播攻击
场景
给定了不同的模数 ni,但指数 e 相同
已知:
c1=memodn1
c2=memodn2
c3=memodn3
解法
使用中国剩余定理进行广播攻击
1 |
|
第二部分主要是一些 Oracle 相关的内容
依赖库:
- gmpy2
- pycrypto
- pwntools
- sage
选择密文攻击
场景
假设 Alice 创建密文 C=Pemodn,并发送给 Bob,并且我们有一次选择密文进行解密的机会,此时我们可以拦截 C,并通过选择密文攻击,求出 P
解法
- 选择任意一个 G(n)内与 n 互素的 X(一般就是 2 啦)
- 计算 Y=C×Xemodn
- 由于选择密文攻击,将 Y 作为密文我们可以得到 Z=Ydmodn
- 最后由于
可以通过逆元求出 P
1 |
|
parity oracle
场景
假设存在一个 Oracle,它会对一个给定的密文进行解密,并且会检查解密的明文的奇偶性,并根据奇偶性返回相应的值,比如 1 表示奇数,0 表示偶数。那么给定一个加密后的密文,我们只需要 log(N) 次就可以知道这个密文对应的明文消息
解法
假设 C=PemodN
第一次我们发送 C×2e=(2P)emodN 给服务器,服务器会返回 2PmodN
我们知道:
- 2P 是偶数,因此(2P)e 也是偶数
- N 是奇数(不考虑存在因子为 2 时)
那么:
- 服务器返回奇数时,说明 2P>N,且减去了奇数个 N 同时我们又知道 P<N,即 N/2≤P<N
- 服务器返回偶数时,说明 0≤P<N/2
归纳:
假设第 i 次时,我们有
xN/2i≤P<(x+1)N/2i
在第 i+1 次时,我们可以得到
2i+1PmodN=2i+1P−kN
0≤2i+1P−kN<N
kN/2i+1≤P<(k+1)N/2i+1
根据第 i 次结果我们分子分母同乘 2,有
2xN/2i+1≤P<2(x+1)N/2i+1
那么:
- 服务器返回奇数,则 k 必然是一个奇数,k=2y+1, 那么 (2yN+N)/2i+1≤P<(2yN+2N)/2i+1。与此同时,由于 P 必然存在,所以第 i+1 得到的这个范围和第 i 次得到的范围必然存在交集。所以 y 必然与 x 相等。
- 服务器返回偶数,则 k 必然是一个偶数,k=2y,此时 y 必然也与 x 相等,那么 2xN/2i+1≤P<(2xN+N)/2i+1
总结:
1 |
|
byte oracle
场景
假设目前存在一个 Oracle,它会对一个给定的密文进行解密,并且会给出明文的最后一个字节。那么给定一个加密后的密文,我们只需要 log256n 次就可以知道这个密文对应的明文消息。
解法
是 parity oracle 的扩展,此时泄露一个 byte,因此我们将原来的发送 C×2e 改成 C×256e 即可
已知
C=PemodN
第一次我们发送
C×256e=(256P)emodN
服务器返回 256PmodN
此时有:
- 256P 为偶数
- N 为奇数
由于 P<N, 我们有 256PmodN=256P−kN(k<256),并且对于不同的,k1,k2, 我们有 256P−k1n≢256P−k2nmod256
由于是模 256,所以 256P−kn≡−knmod256,因此我们首先可以枚举 0−255 情况下的最后一个字节,并得到映射表
当服务器返回最后一个字节 b,我们就可以通过映射表得到 k,即减去了 k 个 N,有 kN≤256P≤(k+1)N
归纳:
假设在第 i 次时,有
xN/256i≤P<(x+1)N/256i
当第 i+1 次时,发送 C∗256(i+1)e,服务器返回
256i+1PmodN=256i+1P−kN
0≤256i+1P−kN<N
kN/256i+1≤P<256(x+1)N/256i+1
总结:
1 |
|
d 泄露攻击
场景
题目同时给出了 d、e 和 N
解法
我们知道 ed≡1modφ(n),则存在 k,使得
ed−1=kφ(n)
又有∀a∈Zn∗,满足 aed−1≡1modn,令
ed−1=2st
其中,t 是一奇数,可以证明对于至少一半的∀a∈Zn∗,存在一个 i∈[1,s],使得
成立,如果 a,i 满足上述条件,可以对 n 进行暴力分解
1 |
|
n 多因子
场景
当 n 由多个因子组成时
解法
多个因子时,我们根据欧拉函数求得对应的φ(n)即可
φ(x)=x∏i=1n(1−1/pi)
其中 pi 是 x 的所有质因数
选择明文攻击
场景
存在一个加密 Oracle,能够返回加密后的密文。求出对应的 e 和 n
解法
求解 e
当 e 较小时,可以通过 sage 的 bsgs 函数求得 e
1 |
|
求解 n
分别加密、、、2、4、8、16…
我们可以得到:
c2=2emodn
c4=4emodn
c8=8emodn
那么:
c22≡c4modn
c23≡c8modn
所以有:
c22−c4=kn
c23−c8=tn
最后求得他们的公因子就是 n,使用的 Oracle 数据越多,公因子是 n 的概率越大
1 |
|
第三部分是基本的 Coppersmith 相关内容
依赖库:
- gmpy2
- pycrypto
- pwntools
- sage
引子
c=memodN, 当 |m|<N1/e 时,我们能很快求得 m 的值
当 |m|>N1/e 时,如果已知 m 的部分信息 m0,能不能恢复未知 x 的值,这就是 Corppersmith 要解决的问题
c=(m0+x)emodN
已知部分明文攻击
引理 1
假设 N 是一个未知因子组成的数,且存在一个因子 b≥Nβ,0<β≤1,f(x) 是一个一元δ阶多项式,且 c≥1,那么可以在 O(cδ5log9(N))复杂度内求解下列等式的所有的 x0
f(x)=0modb,|x0|≤cNβ2/δ
场景
设 m=m0+x0,其中 x0 是未知的,那么我们可以列出以下多项式
f(x)=(m0+x)e−cmodN,f(x0)=0
当 e 和 x0 很小的时候,Coppersmith 就能求出 x0 的值
解法
在这个场景中,我们知道 b=N,δ=e,β=1,设 c=1,此时 |x0|≤cNβ2/δ=N1/e,因此,为了求解 x0,我们需要知道原消息 m 至少 (1-1/e)*N.bit_length()
比特的信息
碰到的最常见的是已知明文高位攻击,但其实未知的部分在哪里都可以,只要是连贯的,就能构造对应的 f(x)进行求解
已知明文高位
1 |
|
已知明文低位
将构造的函数改为以下即可
1 |
|
当然, 如果是明文的中间部分 bit 未知,也是相同的去修改对应的多项式 f(x)即可,具体题目见https://cryptohack.org/challenges/rsa/ 中的 Null or Never 题目(Coppersmith 是该题的一种解法)
已知部分 p 攻击
场景
已知 p=p0+x, 且 |x|<N1/4 时,也就是知道 p 的大约一半 bits 信息时,可以得到对应的 x,从而对 N 进行分解
解法
此时根据 p=p0+x0 我们知道 p0=x0modp,所以可以列出多项式,f(x)=p0−xmodp,f(x0)=0modp
对应到引理中,显然 b=p,由于在 RSA 中,和 p 和 q 经常为同比特的素数,所以设置,beta=0.4,0.3 等都可
已知 p 高位
1 |
|
已知 p 低位
同样的,已知 p 低位或者中间部分未知,修改对应的 f(x)的表达式即可,例如已知 p 低位,则
1 |
|
部分私钥暴露攻击
场景
当已知私钥的部分 bit 信息,私钥 d=d0+x,d0 的 bit 数目约为 d 的 1/4 时,可以恢复私钥 d
解法
根据论文《An Attack on RSA Given a Small Fraction of the Private Key Bits》
假设私钥 d 的 bit 数目为 kbits, 且已知的是私钥的低位
那么我们可以知道 d0=dmod2kbits
所以有 ed0=1+k(N−s+1)mod2kbits,(s=p+q)
所以我们可以通过解 ed0x−kx(N−x+1)=xmod2kbits 得到可能的 smod2kbits 的值,继续通过求解 p2−sp+N=0mod2kbits,就能得到 pmod2kbits 的值了,进而把问题转换为已知部分 p 攻击。下面这个日本大哥的脚本是把 1、2 两步结合起来列式了,所以只求一个方程解出了部分 p
1 |
|
如果将 1、2 两步分开列式,则修改函数 find_p
如下
1 |
|
但是速度上好像慢一些。
同样的已知 d 高位等也可以进行求解,例如已知 d 高位,那么第一步解出来的其实是可能的 p 的低位,所以在解部分 p 时,修改 f = (2^kbits)*x + p0 即可
例题:2020 天翼杯 hardRSA
题目脚本:
1 |
|
从题目看也是 Coppersmith partial d
的情况,只是这里由于 n 由、、p、q、r 三个素数组成,因此需要我们重新推导同余方程
已知:kbits=540、p、qr、d0 的值,d0=dmod2kbits
推导如下:
(1)ed0=1+k(p−1)(q−1)(r−1) =1+k(pq−p−q+1)(r−1) =1+k(pqr−pr−qr−1−pq+p+q+r) =1+k(N−p(r+q)+s−qr−1) =1+k(N−p(r+q)+(r+q)+p−qr−1) =1+k(N−ps+s+p−qr−1) =1+k(p−1)(qr−s+1)mod2kbits,(s=q+r)通过上式可以求得所有的 smod2kbits 的值,同时我们知道(2)q2−sq+qr=0mod2kbits 联立公式 1×q 和公式 2×k(p−1),可以得到公式
(3)ed0q=q+kq(p−1)(qr−s+1)
(4)k(p−1)qr=kq(p−1)(s−q)
相加得到:
ed0q+k(p−1)qr=q+kq(p−1)(qr−q+1)
即:
ed0q+k(p−1)qr−k(p−1)q(qr−q+1)=qmod2kbits
解上述同余方程,即可得到 qmod2kbits
由于 kbits=540,而 q 只有 510bits,所以解出来的就是可能的 q 的值,再通过 qr 过滤即可
1 |
|
short padding attack
场景
Short padding attack
经常和 相关消息攻击结合 (https://blog.ycdxsb.cn/2decc525.html#more) 使用
我们已知 c1=memodn,c2=(m+padding)emodn,但我们不知道具体的 padding
值是多少
解法
首先通过 short padding attack
求出padding
的值,然后再使用相关消息攻击求得消息 m
1 |
|
第四部分是相关消息的内容
依赖库:
- gmpy2
- pycrypto
- pwntools
- sage
线性相关消息
场景
这是相关消息攻击最简单的一种形式,已知,c1=m1emodN,c2=(am1+b)emodN,m2=am1+b
解法
可以看到两次加密的消息 m1 和 m2 存在线性关系,当 e=3 时,根据推导(见《Low-Exponent RSA with Related Messages》),可以得到以下关系
m1=bac2+2a3c1−b3c2−a3c1+2b3,因此可以根据已知的、、、c1、c2、a、b 轻松得到消息 m1(注意,这里的除法是求逆元的意思)
1 |
|
进阶
下面是论文中的通用情况,即 c1=(a1m+b1)emodn,c2=(a2m+b2)emodn,不通过前面推公式的方法,只需要通过 gcd 即可求得对应的消息。由于式子(a1m+b1)e−c1modn 和(a2m+b2)e−c2modn 都必然存在公共的 x−m 的根,因此通过 gcd 求得 x−m,即可得到对应的消息 m,
1 |
|
多消息相关
场景
假设存在 k 个消息,它们有关系式 P0(x1,x2,…xk)=p(x1,x2,…xk)=0modN
并且有 Pi(xi)=xie−ci=0modN,需要求解这 k 个消息
解法
根据这 k+1 个等式,我们计算 Groebner 基 Groebner([P0,P1,…Pk]),可以得到结果[x1−m1,…xk−mk],
也就求得了所有的 k 个消息
以下举例论文中比较特殊的线性相关消息,即 P0(x1,x2…xk)=x1+x2+…xk−w=0
1 |
|
解的脚本如下:
1 |
|
Hastad 攻击
场景
前面的两个相关消息攻击模数都是相同的,而在 Hasted 广播攻击中则不同
使用不同但互质的模数 n,相同的指数 e、加密 e 个明文得到 e 个密文,即 ci=(aix+bi)emodni,i=1,2…e
解法
通过这 e 个式子,我们有 e 个等式:,(aix+bi)e−ci≡0modni,i=1,2…e
由于这 e 个式子中,模数都是互质的,那么通过中国剩余定理,我们可以得到,P(x)≡0modM,M=∏i=1eni,而 P(x)又必然存在唯一解,并满足 LLL 算法约束,因此可以通过 sage
的small_roots
函数解得,以下给出两个写法分别来自https://github.com/ValarDragon/CTF-Crypto/blob/master/RSA/hastads.sage 和 https://xz.aliyun.com/t/6813
1 |
|
SMUPE 问题
场景
在经历了模数相同的相关消息攻击,也看过了模数不同的 Hastad 攻击,但是我们的指数 e 始终是一致的,SMUPE 问题是论文《Solving Systems of Modular Equations in One Variable: How Many RSA-Encrypted Messages Does Eve Need to Know? 》中提出的,不仅模数不同,且指数 e 也不同,具体如下:
假如我们有 k 个式子,ci=(aix+bi)eimodni,i=1,2…k,此时如何求解未知的消息呢
解法
示例 1:以论文中为例,已有 4 个公钥 (e,N) 分别为(3,N1),(3,N2),(5,N3),(5,N4),且有 ci=(aix+bi)eimodNi,i=1,2…4
由于阶次不同,无法直接进行 CRT,因此需要构造得到同阶次的式子进行 CRT。
1 |
|
示例 2:
也是为了更加深入理解这个构造,在此示例中,e 分别为 2 和 3
1 |
|
PS:small_roots
的参数需要根据实际情况进行调整
1 |
|
绕过 Miller-Rabin 素性测试
题目要求在 2**600
到2**900
范围内找到一个数,这个数不是质数,但可以通过 Miller-Rabin
素性测试
1 |
|
从虽然从参考资料中的论文给出了一些示例,但都不符合题目的限制,不过好在参考资料的 appendix A
里给了十分完整的示例,可以对着复现和验证
假设我们的伪素数 n=p1p2…ph,其中 pi 是不同的素数,使得 n 是基 a1,a2…at 下的伪素数,在本文中,h=3
论文中的方法是先找到一个 p1,然后生成 pi=ki(pi−1)+1,最后合成伪素数 n
找 p1 的步骤如下
Step1:求 Sa
显然对于 miller_rabin(p,64)
而言,我们的 A
为 64 以下的所有质数,求 A
如下
1 |
|
而我们要求的 Sa
集合,它要求,对于每个基 a
,在3~(4*a-1)
范围内所有与 a
的Jacobi
结果为 -1
的数字的集合,如下
1 |
|
Step2:求 Sb
在求 Sb
前,我们需要先指定 ki 的值(只要是质数就行),这里我们指定、k2=701、k3=257
我们可以看到 Sb
其实就是取了一个 ki−1(Sa+ki−1)的交集
1 |
|
Step3 :CRT 求 p1
最后从每个基的 Sb
集合中选择一个,进行 CRT
求出 p1
由于是随机选取,所以 CRT 未必满足条件,因此要多次 random 选出能成功 CRT 的序列
1 |
|
然后求一下 p1
的模数,根据 pi=ki(p1−1)+1 求出其余的数,稍微调整一下大小到 600bits-900bits
之间即可
1 |
|
完整 exp
1 |
|
相关
费马分解
Rabin 加密
Rabin 密码系统是第一个非对称密码系统,由Michael Oser Rabin 于 1979 年在论文 *Digitalized Signatures and Public-Key Functions as Intractable as Factorization* 中发表。可以证明从密文中恢复明文与分解一样困难,它的安全性来源于大整数的因子分解。优点:
- Rabin 函数的每个输出都可以由四个可能的输入中的任何一个生成
- 如果每个输出都是密文,则解密时需要额外的复杂性来识别四个可能的输入中的哪一个是真正的明文
(71 条消息) CTFshow- 卷网杯 -crypto- 真·简单·不卷·现代密码签到(复现)_这就是强者的世界么的博客 -CSDN 博客
(71 条消息) 卷王杯 - 部分 Crypto-wp_mxx307 的博客 -CSDN 博客
kali 工具
readelf :
查看 elf 信息
objdump:
查看 elf 反汇编信息