[鹤城杯 2021]easy_crypto--核心价值观解码
使用在线工具直接解密得到flag
CTF在线工具-在线核心价值观编码|核心价值观编码算法|Core Values Encoder
flag{IlUqU9O5guX6YiITsRNPiQmbhNRjGuTP}
[强网拟态 2021]拟态签到题--BASE64
打开后看着像是BASE64编码,一样使用在线工具解码
Base64 在线编码解码 | Base64 加密解密 - Base64.us
flag{GaqY7KtEtrVIX1Q5oP5iEBRCYXEAy8rT}
[SWPUCTF 2021 新生赛]crypto8--UUencode加密
打开后我也不知道是什么,题目提示古典密码,看了师傅们才知道是UUencode加密(第一次见)还是在网上找在线工具就行
NSSCTF{cheese_is_power}
[SWPUCTF 2021 新生赛]crypto7--MD5
打开后得到这个,数了一下32位,MD5加密过的,在线工具解密即可
NSSCTF{md5yyds}
[SWPUCTF 2021 新生赛]crypto6
也是base家族,已经给了提示,经过了三层编码,分别是base64,base32,base16,反过来分别解码即可
解码得到
JZLVK6CNKRATKT2ENN2FUR2NGBGXSMDYLFWVC6SMKRAXOWLKKF2E6VCBO5HVISLXJZVEKMKPI5NGY===
继续
NWUxMTA5ODktZGM0My0xYmQzLTAwYjQtOTAwOTIwNjE1OGZl
5e110989-dc43-1bd3-00b4-9009206158fe
[SWPUCTF 2021 新生赛]ez_caesar
打开后是一个python附件
import base64
def caesar(plaintext):
str_list = list(plaintext)
i = 0
while i < len(plaintext):
if not str_list[i].isalpha():
str_list[i] = str_list[i]
else:
a = "A" if str_list[i].isupper() else "a"
str_list[i] = chr((ord(str_list[i]) - ord(a) + 5) % 26 + ord(a) or 5)
i = i + 1
return ''.join(str_list)
flag = "*************************"
str = caesar(flag)
print(str)
#str="U1hYSFlLe2R0em1mYWpwc3RiaGZqeGZ3fQ=="
分析后面注释,str的后面有==,猜测是base64,先解码
得到
SXXHYK{dtzmfajpstbhfjxfw}
再来分析一下代码,其中else那儿的大致意思就是将字母后移5位,大小字母需分别处理,那我们解码后向前移5位即可
代码
# 给定加密字符串
str = "SXXHYK{dtzmfajpstbhfjxfw}"
flag = ''
# 遍历字符串中的每个字符
for i in str:
# 检查字符是否不是字母
if not i.isalpha():
flag += i # 如果不是字母,直接添加到标志中
else:
a = 'A' if i.isupper() else 'a' # 确定字符是大写还是小写
# 使用凯撒密码进行解密,偏移量为5
flag += chr((ord(i) - ord(a) - 5) % 26 + ord(a))
# 打印解密后的字符串
print(flag)
得到flag
NSSCTF{youhaveknowcaesar}
[SWPUCTF 2021 新生赛]crypto10--凯撒
提示了凯撒,直接用在线工具就行了
枚举找到了NSSCTF
NSSCTF{congratulations!!!}
[SWPUCTF 2021 新生赛]pigpig--猪圈密码
打开后是一张图片,下面一串字符,这是猪圈密码,按照图一一对应
解出明文为(就是flag)
whenthepigwanttoeat
[鹤城杯 2021]A_CRYPTO
4O595954494Q32515046324757595N534R52415653334357474R4N575955544R4O5N4Q46434S4O59474253464Q5N444R4Q51334557524O5N4S424944473542554O595N44534O324R49565746515532464O49345649564O464R4R494543504N35
首先,有数字和字母,且没有等号,猜测是ROT13
ROT-13 编码是一种每一个字母被另一个字母代替的方法。这个代替字母是由原来的字母向前移动 13 个字母而得到的。数字和非字母字符保持不变。
提示:编码和解码都是由相同的函数完成的。如果您把一个已编码的字符串作为参数,那么将返回原始字符串。
4B595954494D32515046324757595A534E52415653334357474E4A575955544E4B5A4D46434F4B59474253464D5A444E4D51334557524B5A4F424944473542554B595A44534B324E49565746515532464B49345649564B464E4E494543504A35
发现字母范围是A-F,判断是base16
KYYTIM2QPF2GWYZSNRAVS3CWGNJWYUTNKZMFCOKYGBSFMZDNMQ3EWRKZOBIDG5BUKYZDSK2NIVWFQU2FKI4VIVKFNNIECPJ5
只有数字和字母,没有0,1,猜测是base32编码
V143Pytkc2lAYlV3SlRmVXQ9X0dVdmd6KEYpP3t4V29+MElXSER9TUEkPA==
有=,且有0,判断是base64编码
W^7?+dsi@bUwJTfUt=_GUvgz(F)?{xWo~0IWHD}MA$<
有很多其他的符号,猜测base85编码,解码得到
flag{W0w_y0u_c4n_rea11y_enc0d1ng!}
[SWPUCTF 2021 新生赛]ez_rsa
p = 1325465431
q = 152317153
e = 65537
计算出d,将d用MD5加密后包裹NSSCTF{}提交
这一题考RSA
关于RSA
RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,通常用于加密和解密数据、数字签名和密钥交换。RSA算法基于两个大素数的乘积难以分解的数论问题,其安全性基于大整数分解的困难性。
RSA算法涉及三个主要步骤:密钥生成、加密和解密。
-
密钥生成:
- 选择两个不同的大素数 p 和 q。
- 计算它们的乘积 n = p * q,这就是RSA的模数。
- 计算欧拉函数 φ(n) = (p-1) * (q-1)。
- 选择一个整数 e,1 < e < φ(n),且 e 与 φ(n) 互质。
- 计算 e 的模反元素 d,即 d ≡ e^(-1) (mod φ(n))。
- 公钥为 (n, e),私钥为 (n, d)。
-
加密:
- 对于要加密的消息 m,使用接收者的公钥 (n, e)。
- 计算密文 c = m^e mod n。
- 发送密文 c 给接收者。
-
解密:
- 接收者使用自己的私钥 (n, d)。
- 计算明文 m = c^d mod n。
- 得到原始消息 m。
好了,继续解题,使用代码解码一下
import gmpy2
p = 1325465431
q = 152317153
e = 65537
a = (p - 1) * (q - 1)
b = gmpy2.invert(e,a)
print(b)
43476042047970113
再使用MD5加密得到
NSSCTF{08bb8fb628da85923e5734a75ac19ffe}
[LitCTF 2023]梦想是红色的
打开也是核心价值观解码
LitCTF{为之则易,不为则难}
[BJDCTF 2020]base??
打开后是这种,第一部分有64位,题目也提示了是base,所以推断是base64编码,写出来后为
JKLMNOxyUVzABCDEFGH789PQIabcdefghijklmWXYZ0123456RSTnopqrstuvw+/
并且,它重新定义了base64(就像原本的base64中0对应的是A,这儿0对应的是j)
它换了一下代码,我们写个base64的脚本,改一下就行了
c = "JKLMNOxyUVzABCDEFGH789PQIabcdefghijklmWXYZ0123456RSTnopqrstuvw+/=" # 自定义的 base64 字符集
text = "FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw" # 待解码的文本
end = ""
# 将文本中的每个字符转换为其在自定义 base64 字符集中的索引,并将结果转换为二进制字符串拼接起来
for i in text:
end += bin(c.find(i))[2:].zfill(6)
print(end)
x = ""
# 将拼接的二进制字符串每 8 位进行分割,转换为对应的 ASCII 字符,并拼接起来
for i in range(0, len(end), 8):
ins = end[i:i+8]
x += chr(int(ins, 2))
print(x)
运行后得到
BJD{D0_Y0u_kNoW_Th1s_b4se_map}
[SWPUCTF 2021 新生赛]traditional
嗯。。。读懂了没
找一下八卦与二进制的对用关系
根据二进制数的规定:有,用1表示;无,用0表示。我们可以得出八卦各卦阳爻和阴爻的二进制数。下面我们写出八卦各卦阳爻的二进制数(即有阳爻为1,无阳爻为0):
坤:黑黑黑,卦符阴阴阴,二进制数为000
艮:黑黑白,卦符阴阴阳,二进制数为001
坎:黑白黑,卦符阴阳阴,二进制数为010
巽:黑黑白,卦符阴阳阳,二进制数为011
震:白黑黑,卦符阳阴阴,二进制数为100
离:白黑白,卦符阳阴阳,二进制数为101
兑:白白黑,卦符阳阳阴,二进制数为110
乾:白白白,卦符阳阳阳,二进制数为111
用这个来分别对应文本中的: 震坤艮 震艮震 坤巽坤 坤巽震 震巽兑 震艮震 震离艮 震离艮
二进制:001000100 001100001 000110000 000110001 001110011 001100001 001101100 001101100
转换为十进制:68 97 48 49 115 97 108 108
再去找他对应的ASCII码:NSSCTF{Da01sall}
[LitCTF 2023]Hex?Hex!(初级)
打开后得到这个,在线工具就秒了
4c69744354467b746169313131636f6f6c6c616161217d
HEX转字符 十六进制转字符 hex gb2312 gbk utf8 汉字内码转换 - The X 在线工具
LitCTF{tai111coollaaa!}
[SWPUCTF 2021 新生赛]crypto2
打开后得到python文件,题目已经给出是共模攻击的题目
from gmpy2 import *
from Crypto.Util.number import *
flag = '***************'
p = getPrime(512)
q = getPrime(512)
m1 = bytes_to_long(bytes(flag.encode()))
n = p*q
e1 = getPrime(32)
e2 = getPrime(32)
print()
flag1 = pow(m1,e1,n)
flag2 = pow(m1,e2,n)
print('flag1= '+str(flag1))
print('flag2= '+str(flag2))
print('e1= ' +str(e1))
print('e2= '+str(e2))
print('n= '+str(n))
#flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
#flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
#e1= 3247473589
#e2= 3698409173
#n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313
上共模攻击的脚本
from gmpy2 import * # 导入 gmpy2 库,用于快速数学运算
from Cryptodome.Util.number import * # 导入 Cryptodome 库,用于数字转换为字节流
# 第一个密文和第二个密文
c1 = 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
c2 = 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
# 第一个指数和第二个指数
e1 = 3247473589
e2 = 3698409173
# 模数
n = 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313
# 计算 e1 和 e2 的模反元素
_, s1, s2 = gcdext(e1, e2)
# 输出 s1 和 s2
print(s1)
print(s2)
# 解密得到明文
m = powmod(c1, s1, n) * powmod(c2, s2, n) % n
# 将明文从长整型转换为字节流并打印出来
print(long_to_bytes(m))
得到
NSSCTF{xxxxx******xxxxx}