RSA加密算法
rsa基本组成
在RSA加密算法中,以下是常用的符号和对应的含义:
e:公钥指数(exponent),用于加密操作。通常为一个较小的固定值,例如65537。
p和q:两个不同的大素数,用于生成RSA密钥对。它们的乘积n (n = p * q) 是模数(modulus),用于加密和解密操作。
d:私钥指数(exponent),用于解密操作。它通过使用扩展欧几里得算法计算得到,满足 e * d ≡ 1 (mod φ(n)),其中 φ(n) 是欧拉函数值。
n:模数(modulus),也是公钥和私钥共享的一个参数。它是两个素数 p 和 q 的乘积,即 n = p * q。
φ(n)即phi:欧拉函数(Euler’s totient function)的值,表示与 n 互质的正整数的数量。对于两个素数 p 和 q 的乘积 n,φ(n) = (p-1)*(q-1)。
m:明文(plaintext),需要被加密的消息或数据。m=c^d mod n
c: 密文,c=m^e mod n
总结:
e是公钥指数,p和q是素数,d是私钥指数,n是模数,phi是欧拉函数值,m是明文。
已知p,q,e求d(rsa)
我们导入python的gmpy2库,这个库求rsa超好用
1 | from gmpy2 import invert |
成功得到flag
已知p,q,e,c 求明文m [buu rsarsa题]
1 | from libnum import n2s,s2n |
已知p,q,dp,dq,c 求明文m [buu RSA1题]
小记一下:在RSA密码中,dp和dq是私钥的参数,用于加速中国剩余定理(Chinese Remainder Theorem, CRT)解密算法。
dp:是d对p-1的模反元素(modular inverse)。即 dp = d mod (p-1)。
dq:是d对q-1的模反元素。即 dq = d mod (q-1)。
这两个参数在CRT解密算法中起到加速解密过程的作用,通过使用CRT算法可以减少模幂运算的计算量,提高解密效率。具体来说,当进行解密时,先对密文进行两次模幂运算,分别使用dp和dq,并分别取得结果m1和m2。然后根据CRT算法,使用p、q、dp、dq以及模数n计算出明文m。这种方式相比于直接使用d进行模幂运算,能够大大提高解密速度。
m = (m1 + (I * (m2 - m1)) * p) % n
1 | from libnum import n2s,s2n |
逆元
给定整数 𝑎a 和模数 𝑚m,如果存在一个整数 𝑥x,使得:
𝑎⋅𝑥≡1(mod𝑚)a⋅x≡1(modm)
那么这个 𝑥x 就是 𝑎a 的模 𝑚m 下的乘法逆元,记作 𝑎−1(mod 𝑚)a−1(mod m)。
已知e1,e2,c1,c2,n 求明文m(共模攻击)[buu RSA3]
小记一下:
根据给定的参数 e1、e2、c1、c2 和模数 n,下面是求解明文 m 的一般步骤:
使用扩展欧几里得算法计算 e1 和 e2 的最大公约数 gcd(e1, e2)。确保它等于 1,否则无法进行共模攻击。
计算 e1 在模 e2 下的模反元素 s1 = e1^-1 mod e2,以及 e2 在模 e1 下的模反元素 s2 = e2^-1 mod e1。
计算明文 m:
计算 x = (c1^s1 * c2^s2) mod n。
计算 m = x mod n。
需要注意的是,在实际计算过程中,可以使用模幂运算算法和模反元素算法来进行计算。
此外,如果 m 不在 0 到 n-1 的范围内,还需要对结果进行适当的调整,以保证明文 m 在正确的范围内。
1 | from gmpy2 import * |
已知e,n,dp,c 求明文m(dp泄露)[buu RSA2题]
小记一下:
dp=d%(p-1)
dq=d%(q-1)
dp*e = i*(p-1)+1
1 | from gmpy2 import * |
已知p,q,e,n,文件加密密文 求密文m [buu RSA题]
e= 65537
n=86934482296048119190666062003494800588905656017203025617216654058378322103517
p= 285960468890451637935629440372639283459
q= 304008741604601924494328155975272418463
d=81176168860169991027846870170527607562179635470395365333547868786951080991441
enc文件不能直接读,应该用代码读
1 | from Crypto.Util.number import bytes_to_long |
已知p+q,(p+1)*(q+1),c,d求明文m([GUET-CTF2019]BabyRSA )
(p+1)(q+1)=pq+1+p+q
n=p*q
m=c^d mod n
写个脚本
1 | from libnum import n2s |
Dangerous RSA(低加密指数攻击)
sa 的加密 为 c = m ^ e mod n
当e 很小,n很大 时,有两种情况
m ^ e 有可能小于 n 。 此时, c = m ^ e 。 密文 m = c 开e次方
当 m ^ e > n 。 此时。 m ^ e = kn + c 。 k 是整数 。对 k 进行爆破,就能找到对应的m
1 | #python3 |
iroot(c+k*n,e)为c+k*n开e次方
mpz用来处理大整数和需要高精度运算
RSAROLL(rsa)
题目信息没看懂,找大佬的wp才知道{920139713,19},一个是n,一个是e,后面那一大串是拆分的c
我们通过网站分解n得到
p= 18443
q=49891
所以已知信息有
p= 18443
q=49891
n=920139713
e=19
我们写脚本来爆c
1 | import libnum |
得到flag
1 | flag{13212je2ue28fy71w8u87y31r78eu1e2} |
rsa2
源码长这样,我们需要将N分解为p和q
p=9046853915223503351787031888977627106934564043204783593118678181991596316582877057556463152579621699010610569526573031954779520781448550677767565207407183
q=11273732364123571293429600400343309403733952146912318879993851141423284675797325272321856863528776914709992821287788339848962916204774010644058033316303937
然后改一下代码
1 |
|
根据原题处理d值并输出
这里就是按照原题给的计算式去处理d值,这里有个小坑,就是由于Python2和Python3有一点区别,在Python3中,hex(d)得到的值在输出形式上相比Python2少了一个末尾的L,再用这个值去做hash得到的md5值也就不同了。经实验发现,正确的结果可以用Python2直接得到,或在Python3中做hash时给参数末尾加上L。
rsa5(低加密指数广播攻击)
低加密指数广播攻击特点
1 | 加密指数e非常小 |
此题给出的e很小且不变,给出了不同的公钥(e,n)和对应的密文c,也就是用不同的公钥加密相同的明文m
解题思路:
不同的模数n中可能存在相同的p或者说q
求出不同n之间的最大公约数 gcd()
得到p或q 可得d
有私钥d就能得到明文
1 | import gmpy2 |
[NCTF2019]childRSA(费马小定理)
1 | from random import choice |
只在基础的RSA上修改了大素数的生成过程。choice()函数从小于10000的素数中随机挑选一个
1 | 这里primes为前10000个素数的列表 |
p,q的生成方式是一个突破口,分析函数getprime(),p,q就是在前10000个素数列表里面随机找几个素数相乘再加一得到的,所以这10000个素数的乘积x是p-1和q-1的倍数,x=k*(p-1),n=p*q,这里就要从n和x得到p。
费马小定理
1 | 若b为一个素数,则对于任意整数a,有a^(b-1) = 1 (mod b),即a^k*(b-1) = 1 (mod b) |
1 | x=k*(p-1),n=p*q |
1 | import gmpy2 |
总结:当知道某一个数x是p-1,q-1的倍数时,就用gcd(2^x-1,n)=p,进一步gcd(pow(2,x,n)-1,n)=p。
[HDCTF2019]bbbbbbrsa
可以明显的看到c是逆过来的,我们重新把c进行排序,在进行base64解码得到c
1 | from base64 import b64encode as b32encode |
rsa4(低加密指数广播攻击)
另外有两点需要注意:
1、此题中的N、c均是以5进制表示,要先用int(“*****”,5)转换为十进制才能计算(开始运行半天都不出结果,看了其他师傅博客才发现原来是五进制)。
2、题目没有给出加密指数e,但是根据低加密指数广播攻击的特性猜e=3、10、17等
1 | from Crypto.Util.number import * |
primefac.modinv(a, n)
: 这个部分使用primefac
库中的modinv
函数,来计算a
在模n
意义下的逆元素。这意味着找到一个数x
,使得 (a * x) % n = 1
[BJDCTF2020]rsa_output
我们审计题目,发现题目给了我们两个一样的m和两个不一样的e和c,我们考虑共模攻击,
c1 = m^e1 mod n =>c1^s1 = m^(e1*s1) mod n
c2 = m^e2 mod n =>c2^s2 = m^(e2*s2) mod n
两者相乘,通过扩展欧几里得定理,我们可知e1与e2互质,必存在s1和s2使e1s1+e2s2=1
由此可求出相对应的s1和s2.
m=(c1*s1+c2*s2)%n
1 | n=21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111 |
[BJDCTF2020]RSA
1 | from Crypto.Util.number import getPrime,bytes_to_long |
我们发现第一个n和第二个n共用一个q,因此我们通过gcd可以得到q的值,从而得到p的值,又已知pow(294,e,n)的值,因此我们可以爆破出e的值
1 | from Crypto.Util.number import getPrime, bytes_to_long, long_to_bytes |
[GWCTF 2019]BabyRSA(解方程)
1 | import hashlib |
求得p和q
接着求d
1 | d=gmpy2.invert(e,(p-1)*(q-1)) |
然后可以求c1,c2
1 | c1=pow(m1,d,N) |
然后联立方程,求得F1,F2
1 | F1=Symbol('F1') |
最后转为字节
1 | import gmpy2 |
SameMod(共模攻击)
模攻击
共模是指:就是明文m,相同。用两个公钥e1,e2加密得到两个私钥d1,d2 和两个密文c1,c2
共模攻击,即当m不变的情况下,知道n,e1,e2,c1,c2, 可以在不知道d1,d2的情况下,解出m
利用条件为=> gcd(e1,e2)=1
根据扩展欧几里得 算法得
可以得到该式子的一组解(s1,s2) 假设s1为正数,s2为负数
有整数s1,s2(一正一负)
存在e1s1+e2s2==1
1 | from Crypto.Util.number import long_to_bytes |
我们发现输出是一串乱码,但当我们看到m的值,发现里面有ascii码的影子
我们进行解码
1 | from Crypto.Util.number import long_to_bytes |
得到flag
[AFCTF2018]可怜的RSA(rsa公钥加密)
我们先利用Crypto.PublicKey的RSA模块从key文件中获取公钥信息n,e
1 | from Crypto.PublicKey import RSA |
得到n,e的值后,对n进行分解,得到p和q
1 | p = 3133337 |
利用gmpy2库通过p,q,ep,q,e求d
1 | from gmpy2 import * |
打包密钥对flag.pnc解密(由于是Base64编码后的密文,因此还需解码)
1 | from Crypto.PublicKey import RSA |
[RoarCTF2019]babyRSA(威尔逊定理)
1 | import sympy |
分析
从代码中可以知道:
p=(B1!)%A1p=(B1!)%A1
q=(B2!)%A2q=(B2!)%A2
又由威尔逊定理知道,
(A−1)!≡ −1 mod A(A−1)!≡ −1 mod A
而B=A-random.randint(1e3,1e5),所以在B的前面补上
(A−1)(A−2)(A−3)…(B+1)(A−1)(A−2)(A−3)…(B+1)
就有
(A−1)(A−2)(A−3)…(B+1)∗(B!)%A=−1%A(A−1)(A−2)(A−3)…(B+1)∗(B!)%A=−1%A
于是再整理一下又有
(A−2)(A−3)…(B+1)∗(B!)%A=1%A(A−2)(A−3)…(B+1)∗(B!)%A=1%A
这就意味这可由(A−2)(A−3)…(B+1)(A−2)(A−3)…(B+1)模A的逆元求得(B!)%A(B!)%A的值。再取nextprime(sympy.ntheory.generate模块里的nextprime不是nextPrime)即可得到p或q的值。
1 | from sympy import nextprime |
RoarCTF{wm-CongrAtu1ation4-1t4-ju4t-A-bAby-R4A}
RSA & what(共模攻击&base64隐写)
我们仔细观察两个文件,发现有两个e和多个c,n是一样的,我们想到共模攻击
1 | from Crypto.Util.number import* |
得到的明文为base64编码,解码后是对base54的介绍,没啥用
我们主要看base64编码是一段一段的
不难想到base64隐写。
我们到网上找一段base64隐写脚本
1 | from Crypto.Util.number import* |
flag吧数字包起来就行了
[NPUCTF2020]EzRSA
根据题设,我们得到以下关系
1 | gift=lcm((p-1)*(q-1)) |
由小学五年级的知识,有
1 | 最小公倍数(p,q) ∗ 最大公因数(p,q) = p∗q |
所以对于gift
有
$$
g
i
f
t
∗
g
c
d
(
p
−
1
,
q
−
1
)
(
p
−
1
)
∗
(
q
−
1
)
ϕ
(
n
)
$$
我们可以求的gift的二进制位数为2045
1 | print(len(bin(gift)[2:])) |
同时我们知道ϕ(n)的位数为2048,因此gcd(p−1,q−1)gcd(p−1,q−1)占3bits,因此最大公因数的范围(十进制)为[4,8]
我们在此范围内遍历最大公因数的值,然后与最小公倍数相乘得到ϕ(n)的值,然后通过逆模运算求得d,然后就可得·明文
但需要注意这里的e不是素数,分解可得e=2*27361
所以在计算时,我们要先将e除以2
值的变化可通过以下表达式体现
$$
c
(
m
2
)
^
{e/
2}
m
o
d
%23
n
$$
所以解出的明文需要开根号再转为字节流
注意:遍历过程中不是所有的值都符合条件,可能会报ZeroDivisionError,因此需要加异常处理
1 | from Crypto.Util.number import * |
DES
[ACTF新生赛2020]crypto-des
encryptedkey.txt
1 | 72143238992041641000000.000000, |
hint.txt
1 | To solve the key, Maybe you know some interesting data format about C language? |
附件1考的是数据在内存中的存储,我们用struct库中的pack函数打包数据
1 | from libnum import* |
我们得到压缩包密码为
1 | Interestring Idea to encrypt |
得到一个加密文件,密钥都给出来了,直接base64解码后,decrypt()解密就行了。
1 | import pyDes |
数论
[网鼎杯 2020 青龙组]you_raise_me_up(大步小步算法)
首先,我们审计题目,可以发现题目中给予了我们m、c和n的值,其中n=2**512,m则是在(2,m)之间的值,c是m^flag = c mod n
可以看出,这是一道求指标的题目,我们可以通过以下方法进行计算,已知的条件为:
2^e = c1 mod n 在这其中,除了e其余条件我们都已知,在这里,我们需要使用离散对数求解的思路:
Shanks’s Babystep-Giantstep Algorithm算法:
1、n=[ √n ]+12、构造两个列表
list1=[1,g,g^2,g^3,……,g^n]
list2=[h,hg^(-n),hg^(-2n),……,hg^(-n**2)]
3、在两个列表中,找到两个相同的数 g^i=hg^(-jn)
=>g^(i+jn)=h mod n
4、我们所求的e=i+jn
python库应用:python(sympy库) x=sympy.discrete_log(n,a,g)
exp
1 | m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075 |
丢失的md5(暴力求解)
将代码修改
1 | import hashlib |
得到flag
Alice and Bob(质因数分离)
https://zh.numberempire.com/numberfactorizer.php
1 | import hashlib |
大帝的密码武器(凯撒密码)
https://www.lddgo.net/encrypt/caesar-cipher
下载下来的文件长这样,我们给它加上.zip后缀就能打开文件了
从已知信息可知为凯撒密码,我们用工具进行移位
第13位出现单词,我们把附件的字符串也移位
得到flag{PbzrPuvan}
Windows系统密码(md5解密)
将下载的附件解压后,发现文件的后缀为hash,即原文本使用了哈希加密,众所周知,哈希密码的加密的过程被认为是不可逆的,
也就是说,人们认为从哈希串中是不可能还原出原口令的。这里我们使用记事本打开文件,得到以下内容:
解题思路
由于哈希密码的不可逆性,我们只能借用一些工具来进行操作,这里我使用的工具网址是:MD5解密。分别对第二行的三段文字进行
求解,便可得到答案为:good-luck
信息化时代的步伐(中文电码)
这是一串中文代码(别问我为什么知道)
找个网站解密
flag出来了
凯撒?替换?呵呵!(凯撒密码爆破)
凯撒密码一般就是26个字母经过单纯的按字母顺序来位移的加密方法(一般)
如:abc=def
进阶版的凯撒就不按照字母顺序的加密
如:abc=dhj
所以就要经过暴力破解出每一种可能的对应加密
前面的MTHJ和字符串中间的{}是明显的flag{}的格式,所以就推断这里的
MTHJ对应的明文就是flag
然后就对字符串中的其他20个字母进行爆破对比,可以写脚本(不会哈哈哈)
用工具吧
flag要去空格,在两边加{}
萌萌哒的八戒(猪圈密码)
打开图片,在下面发现一些图案
经过查询,为猪圈密码
对照密码表依次代入即可,得到答案为:flag{whenthepigwanttoeat}
权限获得第一步(md5解密)
拿去md5解密就能得到flag了
传统知识+古典密码
小明某一天收到一封密信,信中写了几个不同的年份
辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。
信的背面还写有“+甲子”,请解出这段密文。
key值:CTF{XXX}
查表可得序号:28,30,23,8,17,10,16,30
且一甲子为60,所以每个加上60
88,90,83,68,77,70,76,90
对应ascii字符为
XZSDMFLZ
1 | a=[88,90,83,68,77,70,76,90] |
由于古典密码只有栅栏密码和凯撒密码
我们先进行凯撒密码,移动5位进行解密得到SUNYHAGU
再将SUNYHAGU进行栅栏密码解密
得到flag{SHUANGYU}
世上无难事(暴力破解)
打开页面发现一大堆字母,我们直接暴力破解
flag记得把字母改为小写
[AFCTF2018]Morse(摩斯密码&16进制解码)
压缩包里一看就是摩斯密码,但要把/改为空格
解码后还需16进制解码才能得到flag
还原大师(md5爆破).
1 | import hashlib |
异性相吸(二进制异或)
提起异性我们可以想到01,也就是二进制,我们用010把文件内容转化成二进制再异或
1 | a = '0110000101110011011000010110010001110011011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011100010111011101100101011100110111000101100110' |
得到
1 | 0110011001101100011000010110011101111011011001010110000100110001011000100110001100110000001110010011100000111000001110010011100100110010001100100011011100110110011000100011011101100110001110010011010101100010001101010011010001100001001101110011010000110011001101010110010100111000001110010110010101111101 |
我们再解码得到flag
1 | flag{ea1bc0988992276b7f95b54a7435e89e} |
[GXYCTF2019]CheckIn(ROT-N加密)
出现了两个等号,我们先base64解密
里面没有{}可以知道不是凯撒加密,没有=不是base64
但可以发现这里的每一个字符的ASCII在33-126
可以发现是ROT-N加密
得到flag
Cipher(playfair解密)
题目提示:公平的玩吧,也就是playfair,正好有这一种加密为普莱菲尔密码,以playfair为密钥进行普莱菲尔密码解密(要不是我看了wp,鬼知道这玩意)
用flag{}包裹住,得到flag{itisnotaproblemhavefun}
[BJDCTF2020]这是base??(字符替换)
这题的题目是base,我们可以想到base64,但txt文档给出了2个数据,不难想到字符替代
我们将chipertext的字符与dict的字符一一对应,得到每一个字符在dict中的下标
我们查找base64的标准字典
将每一个字符在dict中的下标与标准字典的字符相对应
写脚本
1 | import base64 |
robomunication(音频摩斯密码)
下载文件后,发现是个音频,用Audacity打开,发现它在哔哔哔哔 哔 哔波哔哔。。。原来是摩斯密码
整理后得到:…. . .-.. .-.. — .– …. .- - .. … - …. . -.- . -.– .. - .. … -… — — .–. -… . . .–.
解码得
密码是:HELLOWHATISTHEKEYITISBOOPBEEP
最终解得flag为BOOPBEEP
[WUSTCTF2020]佛说:只能四天(解密大礼包)
佛曰加密网站解密——http://hi.pcmoe.net/buddha.html,得到
马上去核心价值观解密——http://www.hiencode.com/cvencode.html得到
解密内容提示栅栏密码,我们用栅栏密码解密
要去掉后面的__doyouknowfence
栅栏密码_栅栏密码在线加密解密【W型】-ME2在线工具 (metools.info)
我们用凯撒密码解密
我们观察枚举后的结果都没有小写字母,我们考虑base32
在偏移为3是得到flag
达芬奇密码(脑洞题)
我们观察数字列发现跟斐波那契数列的数字一样但是位置不一样
我们对比来看看
1 | def fib_loop_for(n): |
1 | 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 |
我们发现数字列和神秘数字串的个数一样,所以我们猜测要通过比对斐波那契数列,来将c进行排序
例如:1在斐波那契数列中排第一位,那3就在第一位
233在斐波那契数列中排第12位,那6在12位上
1 | a = "0 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309" |
[MRCTF2020]古典密码知多少(古典密码图形)
观察图中信息,可以发现用到了CTF中的图形密码,包括猪圈密码的变形、标准银河字母的加密、和圣堂武士密码。
标准银河字母的加密
圣堂武士密码
解密出来得到
1 | FGCPFLIRTUASYON |
题目信息还提到了fence,我们考虑栅栏密码
可得到有用信息:FLAGISCRYPTOFUN,去掉前面信息得最终结果为:
1 | flag{CRYPTOFUN} |
rot(rot原理)
1 | 破解下面的密文: |
看着像是 ascii 码。
但是有大于 127 的数字存在,所以要先处理。
题目名称为 rot,
1 | ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性,可以自我解密,主要用于应对快速浏览,或者是机器的读取,而不让其理解其意。 |
参考rot原理,将所有数字减13,再转ascii码
1 | s='83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112' |
1 | FLAG IS flag{www_shiyanbar_com_is_very_good_????} |
看样子我们需要对flag的最后4位进行爆破
1 | demo='flag{www_shiyanbar_com_is_very_good_' |
得到flag
这是什么(jsfuck)
我们将apk文件修改为txt文件
我们在文件中发现
我们考虑jsfuck解密
我们f12打开控制台,将括号复制进去
得到flag
[MRCTF2020]天干地支+甲子(天干地支)
1 | 六十年甲子(干支表) |
我们对照得到
1 | 11 51 51 40 46 51 38 |
都加一个甲子(60)得到
1 | 71 111 111 100 106 111 98 |
我们对照ascii表得到
1 | Goodjob |
得到flag
1 | flag{Goodjob} |
[NCTF2019]Keyboard(脑洞)
题目提示键盘,我们发现每一个字母都对应上面的一个数字,我们猜测9键盘,而字母个数就是对应的9键盘上的对应的字母
1 | youaresosmartthatthisisjustapieceofcake |
1 | cipher="ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr ee www ee yyy eee www w tt ee" |
[BJDCTF2020]signin
我们观察,密文为16进制,我们将其转换为字符
1 | from Crypto.Util.number import * |
得到flag
1 | BJD{We1c0me_t4_BJDCTF} |
[MRCTF2020]vigenere(维吉尼亚解密)
我们找一个在线网站
https://www.guballa.de/vigenere-solver
把文本放上去,直接破解,flag是最后一行
[ACTF新生赛2020]crypto-rsa0(zip伪加密)
我们把文件下下来后,在hint.txt提示,文件进行了zip伪加密
一个ZIP文件由三个部分组成:
压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志。
伪加密原理:zip伪加密是在文件头的加密标志位做修改,进而再打开文件时识被别为加密压缩包。 一般来说,文件各个区域开头就是50 4B,然后后面两个字节是版本,再后面两个就是判断是否有加密的关键了
伪加密:
压缩源文件数据区的全局加密应当为 00 00
且压缩文件目录区的全局方式标记应当为 09 00
原理
ZIP伪加密是在文件头的加密标志位做修改,进而再打开文件时识别为加密压缩包。
在参考了网上多数文章无果后,在西普的一个小题找到了可以复现的方法。
给出西普的某个示例:
1 | 压缩源文件数据区 |
保存之后打开压缩包,发发现就可以顺利打开rsa.py文件了
然后就是个rsa解密了
1 | import binascii |
传感器(曼彻斯特编码)
Wiki
曼彻斯特编码(Manchester Encoding),也叫做相位编码( Phase Encode,简写PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。它在以太网媒介系统中的应用属于数据通信中的两种位同步方法里的自同步法(另一种是外同步法),即接收方利用包含有同步信号的特殊编码从信号自身提取同步信号来锁定自己的时钟脉冲频率,达到同步目的。
Encode and Decode
IEEE 802.4(令牌总线)和低速版的IEEE 802.3(以太网)中规定, 按照这样的说法, 01电平跳变表示1, 10的电平跳变表示0。
Ideas
1 | 5555555595555A65556AA696AA6666666955`转为二进制,根据01->1,10->0。可得到 |
1 | cipher='5555555595555A65556AA696AA6666666955' |
[NPUCTF2020]这是什么觅🐎(观察)
用记事本打开是个乱码·
但我们看到开头那个pk,我们想到zip文件,我们将后缀改为zip,成功打开文件
看到有一个字条和日历,猜测是类似矩阵的原理,
1 | F1 W1 S22 S21 T12 S11 W1 S13 |
两个s应该是s1对应周六,s2对应周日
字母最后的数字对应所在的行数
例如F1,第一行的星期五
1 | 3 1 12 5 14 4 1 18 |
对照字母表 calendar,flag{calendar}
浪里淘沙(脑洞)
打开txt文档发现大量的单词,再结合题目给到的一串数字4、8、11、15、16可以考虑到是跟字频有关
我们打开万能的wps进行查询
然后放到excel进行排序
标注起题目要求的编号组合起字符串即可得到flag
flag{weshouldlearnthecrypto}
[WUSTCTF2020]B@se(base64变表)
题目附件内容:
首先通过观察题目字符特征很明显是base64编码,第一行的密文是通过下面给的base64的变表,但是仔细观察缺少了四个字符,因此我们需要写脚本把缺少的字符给还原出来
爆破脚本:
1 | import string |
很明显图中框出来的地方就是最后的flag值
总结:此题考察了缺损的base64变表,需要使用爆破脚本破解出明文。
[AFCTF2018]Single(爆破)
我们下载附件,发现里面有个c语言程序和一个文件
通过代码分析,我们发现Cipher.txt是一个加密后的文件,仔细观察,很明显示是一个无规律替换加密,我们使用词频分析
得到flag
或者我们逆向输出
1 | #include <bits/stdc++.h> |
得到加密前的文件,找到flag
鸡藕椒盐味(海明校验码)
1.分析校验位数
从题目可知验证码为110010100000共12位,校验位一般都是在2^n的位置,所以共有4位校验码在1,2,4,8位置
拓展:海明验证码公式:2^r≥k+r+1 (r为校验位 ,k为信息位),如本验证码本来有8位信息码,带入公式可得r=4,所以在1,2,4,8位置添加相应校验码
2.画表
题目中提到打印的时候倒了一下,所以将信息位倒着填入表中
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 位数 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 信息位(D) | ||||
R1 | R2 | R3 | R4 | 校验位(R) |
3.求校验位的值
例如:1由第一位R1来校验;2由第二位R2来校验;由于3=1+2(1和2指的是位数,都是2的n次方)所以3由第一位R1和第二位R2校验,4由第四位R3校验,5和3道理是一样的,5=1+4(2^0+2^2);6=2+4;7=1+2+4,依次类推。得出下表:
海明码位号 | 占用的校验位号 | 校验位 |
---|---|---|
1 | 1 | R1 |
2 | 2 | R2 |
3 | 1、2 | R1、R2 |
4 | 4 | R3 |
5 | 1、4 | R1、R3 |
6 | 2、4 | R2、R3 |
7 | 1、2、4 | R1、R2、R3 |
8 | 8 | R4 |
9 | 1、8 | R1、R4 |
10 | 2、8 | R2、R4 |
11 | 1、2、8 | R1、R2、R4 |
12 | 4、8 | R3、R4 |
进行汇总,看每个校验位都确定了哪一位。
R1:1、3、5、7、9、11
R2:2、3、6、7、10、11
R3:4、5、6、7、12
R4:9、10、11、12
最后用异或运算求出R1、R2、R3、R4、R5的值(以R1为例):
R1=D1⊕D3⊕D5⊕D7⊕D9⊕D11=1
以此类推:R1=1,R2=0,R3=0,R4=0
可以看到P1P2P3P4=0001,R1R2R3R4=1000
可以求得监督位(异或):
0 | 0 | 0 | 1 | 验证码中的校验码 |
---|---|---|---|---|
1 | 0 | 0 | 0 | 求得的校验码 |
1 | 0 | 0 | 1 | 监督位 |
监督位不为0000,说明接收方生成的校验位和收到的校验位不同,错误的位数是监督位的十进制即9,所以把D9就是题目中提到的错误,得到正确验证码110110100000,然后根据提示MD5hash一下就出来了。
1 | 1 import hashlib |
套入flag{}即可得到答案flag{d14084c7ceca6359eaac6df3c234dd3b}
[AFCTF2018]BASE
我们随便截取文件的一段内容,发现能进行多段解密
1 |