|
@@ -0,0 +1,28 @@
|
|
|
|
|
+# Oblivious Pseudo-Random function
|
|
|
|
|
+
|
|
|
|
|
+# Constructing an OPRF on elliptic curves is possible if the curve is a
|
|
|
|
|
+# prime-order group.
|
|
|
|
|
+Fp = GF(0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001)
|
|
|
|
|
+
|
|
|
|
|
+input_block = Fp(42)
|
|
|
|
|
+
|
|
|
|
|
+# Alice generates a random blinding factor r, and multiplies her input block
|
|
|
|
|
+# with this r
|
|
|
|
|
+r = Fp.random_element()
|
|
|
|
|
+alpha = input_block * r
|
|
|
|
|
+
|
|
|
|
|
+# She sends alpha over to Bob, who has the key k and wants to keep it secret,
|
|
|
|
|
+# so Bob calculates beta from alpha and the key
|
|
|
|
|
+#k = Fp.random_element()
|
|
|
|
|
+k = Fp(69420)
|
|
|
|
|
+beta = alpha * k
|
|
|
|
|
+
|
|
|
|
|
+# And then sends back beta to Alice, who can then unblind the result, by
|
|
|
|
|
+# multiplying beta with 1/r
|
|
|
|
|
+output_block = beta * (1 / r)
|
|
|
|
|
+
|
|
|
|
|
+# If we expand the last calculation we can see how r is eliminated by 1/r
|
|
|
|
|
+# output_block = input_block * r * k * (1/r)
|
|
|
|
|
+# And by cancelling out r and 1/r we get:
|
|
|
|
|
+#output_block = input_block * k
|
|
|
|
|
+print(output_block)
|