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))

 

posted @ 2021-11-26 00:18  微草wd  阅读(172)  评论(0编辑  收藏  举报