import socket
from Crypto.Util.number import *
from sage.all import *
def get_maxfactor(N):
f = factor(N)
print 'factor done'
return f[-1][0]
maxnumber = 1 << 70
i = 0
while 1:
print 'cycle: ',i
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 9999))
sock.recv(17)
# get g,h
sock.recv(512)
sock.sendall("1\n")
sock.recv(512)
sock.sendall("1\n")
data = sock.recv(1024)
print data
if '\n' in data:
data =data[:data.index('\n')]
else:
# receive m=
sock.recv(1024)
(g,h) = eval(data)
# get g,p
sock.sendall("-1\n")
sock.recv(512)
sock.sendall("1\n")
data = sock.recv(1024)
print data
if '\n' in data:
data = data[:data.index('\n')]
else:
# receive m=
sock.recv(512)
(g,tmp) = eval(data)
p = tmp+h
tmp = get_maxfactor(p-1)
if tmp<maxnumber:
print 'may be success'
# skip the for cycle
sock.sendall('quit\n');
data = sock.recv(1024)
print 'receive data: ',data
data = data[data.index(":")+1:]
(c1,c2)=eval(data)
# generate the group
g = Mod(g, p)
h = Mod(h, p)
c1 = Mod(c1, p)
c2 = Mod(c2, p)
x = discrete_log(h, g)
print "x = ", x
print "Flag: ", long_to_bytes(long(c2 / ( c1 ** x)))
sock.sendall('quit\n')
sock.recv(1024)
sock.close()
i += 1
最后迫于计算机内存不够,,没计算出来,,,有时候会崩,多运行几次。。
2018 Code Blue lagalem
题目描述如下
from Crypto.Util.number import *
from key import FLAG
size = 2048
rand_state = getRandomInteger(size // 2)
def keygen(size):
q = getPrime(size)
k = 2
while True:
p = q * k + 1
if isPrime(p):
break
k += 1
g = 2
while True:
if pow(g, q, p) == 1:
break
g += 1
A = getRandomInteger(size) % q
B = getRandomInteger(size) % q
x = getRandomInteger(size) % q
h = pow(g, x, p)
return (g, h, A, B, p, q), (x,)
def rand(A, B, M):
global rand_state
rand_state, ret = (A * rand_state + B) % M, rand_state
return ret
def encrypt(pubkey, m):
g, h, A, B, p, q = pubkey
assert 0 < m <= p
r = rand(A, B, q)
c1 = pow(g, r, p)
c2 = (m * pow(h, r, p)) % p
return (c1, c2)
# pubkey, privkey = keygen(size)
m = bytes_to_long(FLAG)
c1, c2 = encrypt(pubkey, m)
c1_, c2_ = encrypt(pubkey, m)
print pubkey
print(c1, c2)
print(c1_, c2_)
可以看出,该算法就是一个 ElGamal 加密,给了同一个明文两组加密后的结果,其特点在于使用的随机数 r 是通过线性同余生成器生成的,则我们知道