course one

题目1:数字转ascill码

题意:将数字转为ascill码

所以脚本可得:

1
2
3
4
5
6
b=[]
a=[99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, 51, 125]
for i in a:
b+=chr(i)
print(b)
#['c', 'r', 'y', 'p', 't', 'o', '{', 'A', 'S', 'C', 'I', 'I', '_', 'p', 'r', '1', 'n', 't', '4', 'b', 'l', '3', '}']

题目二:十六进制转为字节

题意:十六进制转为字节

脚本可得:

1
2
3
4
5
from Crypto.Util.number import long_to_bytes
a=int("63727970746f7b596f755f77696c6c5f62655f776f726b696e675f776974685f6865785f737472696e67735f615f6c6f747d",16)
print(a)
print(long_to_bytes(a))
#b'crypto{You_will_be_working_with_hex_strings_a_lot}'

题目三:十六进制为base64

题意:十六进制编码为base64

脚本可得:

1
2
3
4
5
6
import base64
a=0x72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf
flag=bytes.fromhex(hex(a)[2:])
print(flag)
print(base64.b64encode(flag))
#b'crypto/Base+64+Encoding+is+Web+Safe/'

题目四:大整数转为字节

题意:大数字转字节

1
2
3
4
from Crypto.Util.number import long_to_bytes
a=11515195063862318899931685488813747395775516287289682636499965282714637259206269
print(long_to_bytes((a)))
#flag=b'crypto{3nc0d1n6_4ll_7h3_w4y_d0wn}'

题目五:简单(字符串)异或

题意:将字符串label的每个字符与13异或

脚本可得:

1
2
3
4
5
6
a="label"
flag=""
for i in a:
flag+=chr(ord(i)^13)
print(flag,end="")
#aloha

题目五:异或的基本算法

题意:异或求出flag

解决方案:直接用最后一个异或前面两个可以得到flag

1
2
3
4
5
6
from pwn import xor
k1=bytes.fromhex('a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313')
k2_3=bytes.fromhex('c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1')
flag=bytes.fromhex('04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf')
print(xor(k1,k2_3,flag))
#b'crypto{x0r_i5_ass0c1at1v3}'

题目六:(异或一定要转为字节去异或)

题意:

用单个字节的意思就是用了单个字符去异或

在ascill码中有256中可能所以遍历所有可能

脚本可得:

1
2
3
4
5
6
7
8
9
10
from binascii import unhexlify,hexlify
cipher='73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d'

cipher_bytes=unhexlify(cipher)
print(cipher_bytes)
for xor_key in range(256):
decoded=bytes([i^xor_key for i in cipher_bytes]).decode(errors='ignore')
if decoded.isprintable():
print(decoded)
#寻找可得crypto{0x10_15_my_f4v0ur173_by7e}

题目七:脑经急转弯异或

题目:

题意:看提示,记住旗帜的标志:”crypto{“

题解:先把数据转换位字节,然后跟标识异或得到提示:key=myXORkey

再将字节和key异或可得到flag

下面是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import xor
data = '0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104'
decoded_data = bytes.fromhex(data) # hex-->byte
str = 'crypto{'
f=bytes(str,"utf-8")
print(xor(decoded_data,f))
key = ''.join((chr(decoded_data[i] ^ ord(str[i]))) for i in range(len(str)))
print(key)
d="myXORkey"
c=bytes(d,"utf-8")
flag=xor(decoded_data,c)
print(flag)
#b'crypto{1f_y0u_Kn0w_En0uGH_y0u_Kn0w_1t_4ll}'

course 2

qusetion 1:

题解:

1
import gmpy2print(gmpy2.gcd(66528,52920))#1512

qusetion 2

题意:扩展gcd

代码解决

1
import gmpy2print(min(gmpy2.gcdext(26513,32321)))#-8404

qusetion 3:

解题代码:

1
print(min(11%6,8146798528947%17))#4

qusetion 4

解题代码:

1
print(pow(273246787654,65536,65537))#1

qusetion 5:

题意:求逆元

题解:

1
from gmpy2 import invertprint(invert(3,13))#9

qusetion 6:

题解:

1
p = 29ints = [14,6,11]for i in range (29):    if(pow(i,2,29) in ints):        print(i)