1、[SWPUCTF 2021 新生赛]crypto2
题目
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
已知flag1,flag2,e1,e2,n; 满足flag1=m1^e1%n ; flag2=m1^e2%n ; 求m1
import gmpy2
e1=3247473589
e2=3698409173
print(gmpy2.gcd(e1,e2))
运行结果为1,说明e1和e2互素
由扩展欧几里得定理,存在x,y;使得xe1+ye2=gcd(e1,e2)=1
import gmpy2
from Crypto.Util.number import *
e1=3247473589
e2=3698409173
flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313
d,x,y=gmpy2.gcdext(e1,e2)
m=pow(flag1,x,n)*pow(flag2,y,n)%n
print(long_to_bytes(m).decode())
解析代码
1.d,x,y=gmpy2.gcdext(e1,e2):gmpy2.gcdext()
函数计算了e1
和e2
的最大公约数,并返回了扩展欧几里得算法的结果,其中d
是最大公约数(d=1),x
和y
是满足贝祖等式的系数。
2.m=pow(flag1,x,n)*pow(flag2,y,n)%n:使用了中国剩余定理(CRT),pow()
函数的第一个参数是底数,第二个参数是指数,第三个参数是模数,
得到flag:NSSCTF{xxxxx******xxxxx}
2.[鹤城杯 2021]A_CRYPTO
题目:4O595954494Q32515046324757595N534R52415653334357474R4N575955544R4O5N4Q46434S4O59474253464Q5N444R4Q51334557524O5N4S424944473542554O595N44534O324R49565746515532464O49345649564O464R4R494543504N35
由提示可知是ROT编码,解码后为
4B595954494D32515046324757595A534E52415653334357474E4A575955544E4B5A4D46434F4B59474253464D5A444E4D51334557524B5A4F424944473542554B595A44534B324E49565746515532464B49345649564B464E4E494543504A35
Base16 解码
KYYTIM2QPF2GWYZSNRAVS3CWGNJWYUTNKZMFCOKYGBSFMZDNMQ3EWRKZOBIDG5BUKYZDSK2NIVWFQU2FKI4VIVKFNNIECPJ5
Base32 解码
V143Pytkc2lAYlV3SlRmVXQ9X0dVdmd6KEYpP3t4V29+MElXSER9TUEkPA==
Base64 解码
W^7?+dsi@bUwJTfUt=_GUvgz(F)?{xWo~0IWHD}MA$<
Base85 解码
flag{W0w_y0u_c4n_rea11y_enc0d1ng!}
3.[SWPUCTF 2021 新生赛]crypto6
题目
源码经过了3 层加密,顺序分别为base64,base32,base16,然后逐层解密就好
import base64
var="************************************"
result="4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D"
var=base64.b64decode(base64.b32decode(base64.b16decode(result)))
print(var)
运行得到结果
4.[SWPUCTF 2021 新生赛]crypto10
题目:AFFPGS{pbatenghyngvbaf!!!},建议直接秒了
根据题目提示可知,直接用ROT13解密
5.[SWPUCTF 2021 新生赛]pigpig
题目:
这是猪圈密码
猪圈密码解密在线网站:http://www.metools.info/code/c90.html
6.[SWPUCTF 2021 新生赛]crypto9
本题直接将脚本给出,所以我们直接运行即可
#AKKPLX{qv5x0021-7n8w-wr05-x25w-7882ntu5q984}
#脚本给你了,去解吧
letter_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' # 字母表
# 根据输入的key生成key列表
def Get_KeyList(key):
key_list = []
for ch in key:
key_list.append(ord(ch.upper()) - 65)
return key_list
# 加密函数
def Encrypt(plaintext, key_list):
ciphertext = ""
i = 0
for ch in plaintext: # 遍历明文
if 0 == i % len(key_list):
i = 0
if ch.isalpha(): # 明文是否为字母,如果是,则判断大小写,分别进行加密
if ch.isupper():
ciphertext += letter_list[(ord(ch) - 65 + key_list[i]) % 26]
i += 1
else:
ciphertext += letter_list[(ord(ch) - 97 + key_list[i]) % 26].lower()
i += 1
else: # 如果密文不为字母,直接添加到密文字符串里
ciphertext += ch
return ciphertext
# 解密函数
def Decrypt(ciphertext, key):
plaintext = ""
i = 0
for ch in ciphertext: # 遍历密文
if 0 == i % len(key_list):
i = 0
if ch.isalpha(): # 密文为否为字母,如果是,则判断大小写,分别进行解密
if ch.isupper():
plaintext += letter_list[(ord(ch) - 65 - key_list[i]) % 26]
i += 1
else:
plaintext += letter_list[(ord(ch) - 97 - key_list[i]) % 26].lower()
i += 1
else: # 如果密文不为字母,直接添加到明文字符串里
plaintext += ch
return plaintext
if __name__ == '__main__':
print("加密请按D,解密请按E:")
user_input = input();
while (user_input != 'D' and user_input != 'E'): # 输入合法性判断
print("输入有误!请重新输入:")
user_input = input()
print("请输入密钥:")
key = input()
while (False == key.isalpha()): # 输入合法性判断
print("输入有误!密钥为字母,请重新输入:")
key = input()
key_list = Get_KeyList(key)
if user_input == 'D':
# 加密
print("请输入明文:")
plaintext = input()
ciphertext = Encrypt(plaintext, key_list)
print("密文为:\n%s" % ciphertext)
else:
# 解密
print("请输入密文:")
ciphertext = input()
plaintext = Decrypt(ciphertext, key_list)
print("明文为:\n%s" % plaintext)
运行结果为
至于这里密钥为什么是NSS,这里是直接看的佬的博客,我们试着解析一下给出的脚本
代码是一个基于凯撒密码的加密和解密程序。
-
Get_KeyList(key)
函数:根据输入的密钥key
生成密钥列表。将密钥中的每个字符转换为对应的 ASCII 值减去 65(对应字母 'A' 的 ASCII 值),得到的结果作为偏移量存储在密钥列表中。 -
Encrypt(plaintext, key_list)
函数:接收明文plaintext
和密钥列表key_list
,返回加密后的密文。函数遍历明文的每个字符,如果是字母,则根据字符的大小写分别进行加密。大写字母使用(ord(ch) - 65 + key_list[i]) % 26
计算加密后的索引,小写字母使用(ord(ch) - 97 + key_list[i]) % 26
计算加密后的索引。将加密后的字符添加到密文字符串中。 -
Decrypt(ciphertext, key_list)
函数:接收密文ciphertext
和密钥列表key_list
,返回解密后的明文。函数遍历密文的每个字符,如果是字母,则根据字符的大小写分别进行解密。大写字母使用(ord(ch) - 65 - key_list[i]) % 26
计算解密后的索引,小写字母使用(ord(ch) - 97 - key_list[i]) % 26
计算解密后的索引。将解密后的字符添加到明文字符串中。 -
if __name__ == '__main__':
:程序的入口点。
注意:ord()
是一个内置函数,它用于返回字符的 ASCII 值,减去 97 的目的是将字符的 ASCII 值转换为相对于小写字母 'a' 的偏移量,+ key_list[i]是
将密钥列表中的第 i
个元素添加到偏移量上。这样可以根据密钥确定每个字符的具体偏移量。