DASCTF Sept X 浙江工业大学秋季挑战赛:CRYPTO
额外记录
bytes_to_long:将字节转换为long整型
from Crypto.Util.number import bytes_to_long
print(bytes_to_long(b"a"))
print(bytes_to_long(b"ab"))
print(bytes_to_long(b"abc"))
#abc :2**16 2**8 2**0
math.pow( x, y ):pow() 方法返回 xy(x 的 y 次方) 的值
pow(x, y[, z]):函数是计算 x 的 y 次方,如果 z 在存在,则再对结果进行取模,其结果等效于 pow(x,y) %z。
签到
#!/usr/bin/env python # -*- coding: utf-8 -*- from Crypto.Util.number import * import random flag=b'flag{******************}' n = 2 ** 256 flaglong=bytes_to_long(flag) m = random.randint(2, n-1) | 1 c = pow(m, flaglong, n) print('m = ' + str(m)) print('c = ' + str(c)) # m = 73964803637492582853353338913523546944627084372081477892312545091623069227301 # c = 21572244511100216966799370397791432119463715616349800194229377843045443048821
和RSA加密很像,最后的加密过程为c = pow(m, bytes_to_long(flag), n)
RSA加密就是明文为m,取公钥e和n,密文c=pow(m,e,n),这边的一个明显区别为,可以理解为flag明文作为RSA加密里面的公钥e进行的求解。
解题脚本
import sympy from Crypto.Util.number import * n = 2 ** 256 m = 73964803637492582853353338913523546944627084372081477892312545091623069227301 c = 21572244511100216966799370397791432119463715616349800194229377843045443048821 flag=sympy.discrete_log(n,c,m) print(long_to_bytes(flag))