Skip to content

Instantly share code, notes, and snippets.

@maple3142
Created September 14, 2023 03:38
Show Gist options
  • Save maple3142/03dac3fd5029ab0c0d571076bb3d38a5 to your computer and use it in GitHub Desktop.
Save maple3142/03dac3fd5029ab0c0d571076bb3d38a5 to your computer and use it in GitHub Desktop.
from Crypto.Util.number import *
from hashlib import sha256
import random
# https://eprint.iacr.org/2018/623.pdf
# vdf implementation using rsa as hidden order group
n = getPrime(512) * getPrime(512)
T = 2**20
def Hprime(bits, seed):
return getPrime(bits, randfunc=random.Random(seed).randbytes)
def compute(n, g, l, T):
# compute g^floor(2^t // l)
# https://eprint.iacr.org/2018/623.pdf section 4.1 algorithm 4
x = 1
r = 1
for _ in range(T):
b = 2 * r // l
r = 2 * r % l
x = pow(x, 2, n) * pow(g, b, n) % n
return x
def vdf_eval(n, g, T):
y = g
for _ in range(T):
y = pow(y, 2, n)
l = Hprime(20, str(g) + str(y))
pi = compute(n, g, l, T)
return y, pi
def vdf_verify(n, g, y, pi, T):
l = Hprime(20, str(g) + str(y))
r = pow(2, T, l)
lhs = pow(pi, l, n) * pow(g, r, n) % n
return lhs == y
g = 48763
y, pi = vdf_eval(n, g, T)
print(vdf_verify(n, g, y, pi, T))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment