buuctf2
#强国杯babyrsa
题目:
1 | p=141755878485521250585193526506481835647909733133264484491826506533095411036871187581787386511037412174342774745629361598256663156186634190655768748475210357241858257598757038958971434010720283092093970656262829235604751943313758736375629372244903654343619477366460118493729379823214225182978297539467629343751 |
题解:
1 | from Crypto.Util.number import long_to_bytes |
国赛 LCG
题目代码
1 | from Crypto.Util.number import * |
解题思路
看已知条件就知道要求出c和a
求a:联立方程,设a为x,因为x × seed^2^ + b × seed - s1 = -c 1
又因为x*seed^2^ + b × seed -s2= - c 2
所以一式减去二式
利用corrppermith攻击
求出根,根就是a
再利用a和s1求出c ,设c为x;所以a × seed^2^ +b ×seed +c - s1 == 0
所以解出c
解题代码:
1 | from sage.all import * |
[BJDCTF2020]伏羲六十四卦
这是什么,怎么看起来像是再算64卦!!!
密文:升随临损巽睽颐萃小过讼艮颐小过震蛊屯未济中孚艮困恒晋升损蛊萃蛊未济巽解艮贲未济观豫损蛊晋噬嗑晋旅解大畜困未济随蒙升解睽未济井困未济旅萃未济震蒙未济师涣归妹大有
嗯?为什么还有个b呢?
b=7
flag:请按照格式BJD{}
1 | # -- coding:UTF-8 -- |
解题思路:
先是看见题目给的提示64卦,在网上找到64卦和二进制的关系;
得到的密文再根据给出的加密脚本逆回去;
下面是解题代码:
1 | s='升随临损巽睽颐萃小过讼艮颐小过震蛊屯未济中孚艮困恒晋升损蛊萃蛊未济巽解艮贲未济观豫损蛊晋噬嗑晋旅解大畜困未济随蒙升解睽未济井困未济旅萃未济震蒙未济师涣归妹大有' |
#鹤城杯2021,babyrsa
题目:
1 | from Crypto.Util.number import getPrime, bytes_to_long |
解题思路:
已知p的高位300位,q的低位256位,因为q % (2^265^) = hint1;q = k× 2^265^ +hint 1
qlow= hint1 =q mod 2^265^
qhigh=k × 2^265^
n = p (qlow + qhigh) =p × k × 2^265^ + p × q mod 2^265^*
两边同时取余2^265^
得到: plow= nlow × q^-1^ mod 2^265^
这样我们就得到了p的低位265位,有已知高位300位,所以未知位数459位,还差5位就可以用coppermith攻击,所以进行爆破
以下是解题代码:
1 | p_high = 1514296530850131082973956029074258536069144071110652176122006763622293335057110441067910479 |
PolyRSA
题目:
1 | #!/usr/bin/env python3 |
解题只有一个思路就是求出k
下面是sagemath代码:
1 | n = 44538727182858207226040251762322467288176239968967952269350336889655421753182750730773886813281253762528207970314694060562016861614492626112150259048393048617529867598499261392152098087985858905944606287003243 |
然后是python代码:
1 | #!/usr/bin/env python3 |
补充另一种方法解出k
利用sympy模块联立方程可以解出
下面是解题代码
1 | import gmpy2 |
#[UTCTF2020]hill
##希尔算法
利用矩阵的原理去加密
算法原理:
一个n*n矩阵(加密矩阵) A
一个英文字符串s
记 a=0,b=1,c=2…z=25
先将s转成数字表示形式.
分组,比如s得到的序列为 x1,x2,x3,x4,x5,x6 n=2,那么要分成每列两个元素的矩阵即:
x1 x3 x5
x2 x4 x6
加密过程: 记上述的矩阵为M,得到的密文矩阵为C,则转化过程为:
(AM)%26=C(注意是M左乘一个A)
解密过程:
M=(A^-1^ C)%26
一般做题过程中n不会太高.以下是题目:
wznqca{d4uqop0fk_q1nwofDbzg_eu}
猜测前面六位为utflag;假设n=2
则加密矩阵为2*2矩阵;求明文我们必须知道加密矩阵,加密矩阵的逆矩阵乘上密文即可求出明文:
求出2*2加密矩阵
上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15s='wznqcaduqopfkqnwofDbzgeu'
flag_pre='utflag'
def getit(a1,b1,c1,a2,b2,c2,a3,b3,c3):
for i in range(26):
for j in range(26):
if (a1 * i + b1 * j) % 26 == c1 and (a2 * i + b2 * j) % 26 == c2 and (a3 * i+b3*j) % 26 == c3:
return (i,j)
x1=getit(22,25,20,13,16,5,2,0,0) ##要自己尝试写在本子上,举例更加好证明;
x2=getit(22,25,19,13,16,11,2,0,6)
import string
flag=''
for i in range(0, len(s),2):
flag+=string.ascii_letters[(x1[0]*string.ascii_letters.index(s[i])+x1[1]*string.ascii_letters.index(s[i+1]))%26]
flag+=string.ascii_letters[(x2[0]*string.ascii_letters.index(s[i])+x2[1]*string.ascii_letters.index(s[i+1]))%26]
print(flag)
巅峰极客
point power
题目内容:
1 | from Crypto.Util.number import * |
根据椭圆曲线的公式和定义:
题解
因为:根据公式和定义 y1^2^ = x1^3^ +ax1 + b
x2 = k^2^ - 2x1
y2 = k (x1-x2) - y1
所以联立方程:
4× k^2^ × y1 ^2^ = (3x1^2^ +a)^2^
1 | from Crypto.Util.number import * |
[2022鹏城杯] easy_rsa
题目描述:
1 | import gmpy2 |
第一个涉及模不互素的问题;
第二个涉及coppermith已知p的高位攻击;
第三个就是求公约数的问题啦;
所以解题代码如下:
1 | from gmpy2 import * |
AES&RSA
题目:
1 | #!/usr/bin/python |
解题思路:
爆破iv 求得n 再将n进行yafu分解得到四个相同的p,因为n=p^k^ 所以k=4
解题代码:
1 | from base64 import * |
[GKCTF 2021]RRRRsa
题目如下:
1 | from Crypto.Util.number import * |
题解:运用了二项式定理和费马定理:
###二项式定理:
###费马定理:
(对于任意的a)都有 a^p^ = a mod p
下面是题解:
1 | c=13492392717469817866883431475453770951837476241371989714683737558395769731416522300851917887957945766132864151382877462142018129852703437240533684604508379950293643294877725773675505912622208813435625177696614781601216465807569201380151669942605208425645258372134465547452376467465833013387018542999562042758 |
#dp高位泄露
∵e $\times$ d == 1 (mod (p-1)*(q-1))
∴ e×d=k1(p−1)(q−1)+1,k1∈Z
∵dp=d(modp−1)
∴e×[k2(p−1)+dp]=k1(p−1)(q−1)+1,k1、k2∈Z
∴e×dp=(p−1)[k1(q−1)−ek2]+1
令k3=k1(q−1)−ek2,即e×dp=k3(p−1)+1
∴e×dp≡1(modp−1)
∵dp<p−1
∴k3<e
∵e×dp=k3(p−1)+1=k3×p−k3+1
∴e×dp+k3−1≡0(modp)
例题
1 | from Crypto.Util.number import * |
解题代码:
1 | import gmpy2 |
杭赛bag
题目如下:
1 | from random import randint |
参考代码 (感谢 RUAN XINGZHI)
解题代码:
1 | m = 1528637222531038332958694965114330415773896571891017629493424 |
rsa
题目:
1 | from Crypto.Util.number import * |
题解:
1 | c=9670726607020944351671204940747927021122961984798144090103241740809652984246397187861619784919850158332729124051811115335648904417579853822542292490318033224916195688565647063342943307830109 |