First tests
This commit is contained in:
parent
6c9f5a725d
commit
23ae9c1990
416
ZKP.md
416
ZKP.md
@ -1,416 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
<img src='./PDPS.png' height=75% width=75% >
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
from nacl.public import Box, PrivateKey, PublicKey
|
|
||||||
from nacl.signing import SigningKey, SignedMessage
|
|
||||||
|
|
||||||
from nacl.encoding import HexEncoder
|
|
||||||
from ecdsa import ellipticcurve, curves, util, numbertheory
|
|
||||||
import ecdsa as pyecdsa
|
|
||||||
import hashlib
|
|
||||||
import binascii
|
|
||||||
from binascii import unhexlify
|
|
||||||
import ecdsa as pyecdsa
|
|
||||||
from ecdsa.ellipticcurve import INFINITY
|
|
||||||
|
|
||||||
#SECP256k1 = pyecdsa.curves.find_curve((1, 3, 132, 0, 10))
|
|
||||||
SECP256k1 = pyecdsa.curves.find_curve((1, 3, 132, 0, 10))
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
|
|
||||||
|
|
||||||
class Point(ellipticcurve.Point):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
kwargs.setdefault('order', SECP256k1.order)
|
|
||||||
super(Point, self).__init__(SECP256k1.curve, *args, **kwargs)
|
|
||||||
|
|
||||||
def __neg__(self):
|
|
||||||
return Point( self.x(), -self.y())
|
|
||||||
|
|
||||||
def __sub__(self, Q):
|
|
||||||
a=self + -Q
|
|
||||||
return Point(a.x(),a.y())
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
priv_key= PrivateKey.generate()
|
|
||||||
signing_key=pyecdsa.SigningKey.generate( curve=SECP256k1)
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
#range for statistical zero-knowledge property.
|
|
||||||
R=2**256 * 2**256 * 2**80
|
|
||||||
B=16# 2**256
|
|
||||||
K =16# 2**256
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
def long_to_bytes (val, endianness='big'):
|
|
||||||
|
|
||||||
# one (1) hex digit per four (4) bits
|
|
||||||
width = val.bit_length()
|
|
||||||
|
|
||||||
# unhexlify wants an even multiple of eight (8) bits, but we don't
|
|
||||||
# want more digits than we need (hence the ternary-ish 'or')
|
|
||||||
width += 8 - ((width % 8) or 8)
|
|
||||||
|
|
||||||
# format width specifier: four (4) bits per hex digit
|
|
||||||
fmt = '%%0%dx' % (width // 4)
|
|
||||||
|
|
||||||
# prepend zero (0) to the width, to zero-pad the output
|
|
||||||
s = unhexlify(fmt % val)
|
|
||||||
|
|
||||||
if endianness == 'little':
|
|
||||||
# see http://stackoverflow.com/a/931095/309233
|
|
||||||
s = s[::-1]
|
|
||||||
|
|
||||||
return s
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
class Client(object):
|
|
||||||
def __init__(O,key=None):
|
|
||||||
if not key:
|
|
||||||
O.k = signing_key=pyecdsa.SigningKey.generate( curve=SECP256k1)
|
|
||||||
else :
|
|
||||||
O.k = key
|
|
||||||
def file_process(O,path="./slice.1_8.fec"):
|
|
||||||
f="A"*32#open(path).read()
|
|
||||||
D=util.string_to_number(f)
|
|
||||||
b=util.string_to_number(O.k.to_string())
|
|
||||||
|
|
||||||
s=D%b
|
|
||||||
n=D//b
|
|
||||||
|
|
||||||
D_1=(n * b) + s
|
|
||||||
r = long_to_bytes(rr)
|
|
||||||
|
|
||||||
print hashlib.sha1(f).hexdigest()
|
|
||||||
print hashlib.sha1(r).hexdigest()
|
|
||||||
|
|
||||||
|
|
||||||
b_id = SECP256k1.generator * n
|
|
||||||
ro1= SECP256k1.generator * n
|
|
||||||
ro2 = SECP256k1.generator * s
|
|
||||||
#private, public
|
|
||||||
return ((n,b,s), (b_id, ro1,ro2))
|
|
||||||
|
|
||||||
def generate_challenge1(O):
|
|
||||||
return util.randrange(R)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
class server(object):
|
|
||||||
def __init__(O, b_id, ro1,ro2):
|
|
||||||
O.ro1=ro1
|
|
||||||
O.ro2=ro1
|
|
||||||
O.file_pub=b_id
|
|
||||||
|
|
||||||
def commitment(O, challenge):
|
|
||||||
f="A"*32#open("./slice.1_8.fec").read()
|
|
||||||
a=util.string_to_number(f)
|
|
||||||
|
|
||||||
O.b=challenge
|
|
||||||
O.z=a%b
|
|
||||||
O.m=a//b
|
|
||||||
O.r = util.randrange(B**2)
|
|
||||||
O.t = util.randrange(B**2)
|
|
||||||
O.x1 = SECP256k1.generator * r
|
|
||||||
O.x2 = SECP256k1.generator * t
|
|
||||||
|
|
||||||
return ((O.x1,O.x2),(O.m,O.z,O.r,O.t))
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
c=Client()
|
|
||||||
#s=server()
|
|
||||||
#priv_c,pub_c=c.file_process()
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
def preprocessing():
|
|
||||||
f=open("./slice.1_8.fec").read()
|
|
||||||
D=util.string_to_number(f)
|
|
||||||
b=util.string_to_number(signing_key.to_string())
|
|
||||||
|
|
||||||
s=D%b
|
|
||||||
n=D//b
|
|
||||||
|
|
||||||
D_1=(n * b) + s
|
|
||||||
#r = long_to_bytes(rr)
|
|
||||||
|
|
||||||
print hashlib.sha1(f).hexdigest()
|
|
||||||
#print hashlib.sha1(r).hexdigest()
|
|
||||||
|
|
||||||
|
|
||||||
b_id = SECP256k1.generator * n
|
|
||||||
ro1= SECP256k1.generator * n
|
|
||||||
ro2 = SECP256k1.generator * s
|
|
||||||
|
|
||||||
return ((n,b,s), (b_id, ro1,ro2))
|
|
||||||
|
|
||||||
|
|
||||||
def generate_challenge(n,b,s):
|
|
||||||
|
|
||||||
b_id = SECP256k1.generator * n
|
|
||||||
ro1= SECP256k1.generator * n
|
|
||||||
ro2 = SECP256k1.generator * s
|
|
||||||
|
|
||||||
return (b_id, ro1,ro2)
|
|
||||||
|
|
||||||
|
|
||||||
client_secret_priv, public_element = preprocessing()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
73ea3b5e061b6cabed623d1f0f8ba0e2dd7a8ef4
|
|
||||||
|
|
||||||
|
|
||||||
<img src='./algo_keys.png' height=25% width=50%>
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
import ecdsa as pyecdsa
|
|
||||||
|
|
||||||
SECP256k1 = pyecdsa.curves.find_curve((1, 3, 132, 0, 10))
|
|
||||||
SECP256k1 = pyecdsa.curves.find_curve((1, 3, 132, 0, 10))
|
|
||||||
|
|
||||||
def generate_priv_challenge():
|
|
||||||
f=open("./slice.1_8.fec").read()
|
|
||||||
blockid= hashlib.sha256(signing_key.sign(f)).hexdigest()
|
|
||||||
a=util.string_to_number(f)
|
|
||||||
b=util.string_to_number(signing_key.to_string())#encode())
|
|
||||||
s=a%b
|
|
||||||
n=a//b
|
|
||||||
ro1= SECP256k1.generator * n
|
|
||||||
ro2 = SECP256k1.generator * s
|
|
||||||
|
|
||||||
return (blockid, ro1,ro2,n,s)
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
block_id,ro1,ro2,n,s = generate_priv_challenge()
|
|
||||||
```
|
|
||||||
|
|
||||||
<img src='./challenge.png' heigth=75% width=75%>
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
def remote_commitment(chall):
|
|
||||||
f=open("./slice.1_8.fec").read()
|
|
||||||
a=util.string_to_number(f)
|
|
||||||
b=chall
|
|
||||||
z=a%b
|
|
||||||
m=a//b
|
|
||||||
print z
|
|
||||||
r = util.randrange(B*B)
|
|
||||||
t = util.randrange(B*B)
|
|
||||||
#w= r^z
|
|
||||||
#print w
|
|
||||||
x1 = r * SECP256k1.generator
|
|
||||||
x2 = t * SECP256k1.generator
|
|
||||||
|
|
||||||
return ((x1,x2),(m,z,r,t))
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
chall = util.randrange(R)
|
|
||||||
|
|
||||||
(commit,ch_resp)=commitment(chall)
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
chall2 = util.randrange(K)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
def remote_resp(c, resp):
|
|
||||||
m=resp[0]
|
|
||||||
z=resp[1]
|
|
||||||
r=resp[2]
|
|
||||||
t=resp[3]
|
|
||||||
|
|
||||||
y1= r+(c*z)
|
|
||||||
y2= t+(c*m)
|
|
||||||
|
|
||||||
return y1,y2
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
y1,y2 = host_resp(chall2, ch_resp)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
chall = util.randrange(R)
|
|
||||||
chall2 = util.randrange(K)
|
|
||||||
|
|
||||||
P = SECP256k1.generator
|
|
||||||
|
|
||||||
|
|
||||||
(commit,ch_resp)=remote_commitment(chall)
|
|
||||||
y1,y2 = remote_resp(chall2, ch_resp)
|
|
||||||
x1=commit[0]
|
|
||||||
x2=commit[1]
|
|
||||||
|
|
||||||
b_ = chall
|
|
||||||
c = chall2
|
|
||||||
|
|
||||||
z = ch_resp[1]
|
|
||||||
m = ch_resp[0]
|
|
||||||
```
|
|
||||||
|
|
||||||
383769705759922238814820635125091393536751781330499963960027267106043604344928356482304970868177244815080981113707959740583852333897030317262689421782904643950974779849213407220
|
|
||||||
|
|
||||||
|
|
||||||
<img src='./proof1.png'>
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
as1_1= ( y1 * P ) + (-Point(x1.x(),x1.y()))#y1.P-x1
|
|
||||||
as1_2= ( c * z ) * P #cz.P
|
|
||||||
print "assert I", as1_1==as1_2
|
|
||||||
print as1_1.x()
|
|
||||||
print as1_2.x()
|
|
||||||
as2_1=( y2 * P ) + ( -Point(x2.x(),x2.y()) )
|
|
||||||
as2_2= (b_* m ) * P
|
|
||||||
print "assert II", as2_1==as2_2
|
|
||||||
print as2_1.x()
|
|
||||||
print as2_2.x()
|
|
||||||
```
|
|
||||||
|
|
||||||
assert I True
|
|
||||||
5876730895232555975670752555686052848272136747449052900777052125475456965293
|
|
||||||
5876730895232555975670752555686052848272136747449052900777052125475456965293
|
|
||||||
assert II False
|
|
||||||
95958819438731652205001323648120835610712117261911186719618043262918945418931
|
|
||||||
55940851260522358385586042305550878175039129341223631825528624425777497241555
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
as2_1=(y2 * P) + (-Point(x2.x(),x2.y()))
|
|
||||||
as2_2= (b_*m) * P
|
|
||||||
print as2_1.x()
|
|
||||||
print as2_2.x()
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
91728786092928355630891141238137171644308836139219436085412195700189316134122
|
|
||||||
107279711877694500410709767952754959809170673439664368886384200698769658470714
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<img src='./equality.png'>
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
SK=b=util.string_to_number(signing_key.to_string())
|
|
||||||
chall*SK * ro1 - chall2 * (y2 * SECP256k1.generator + - Point(commit[0].x(),commit[0].y())
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<ecdsa.ellipticcurve.Point at 0x106e16f50>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
%qtconsole
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
x1=commit[0]
|
|
||||||
Y1=y1*SECP256k1.generator
|
|
||||||
Y1=Point(Y1.x(),Y1.y())
|
|
||||||
RO1=chall2*Point(ro1.x(),ro1.y())
|
|
||||||
X1=Point(x1.x(),x1.y())
|
|
||||||
RO1=Point(RO1.x(),RO1.y())
|
|
||||||
|
|
||||||
assertion1 = Y1-X1-RO1
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
ro1.y()
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
sk=util.string_to_number(signing_key.to_string())
|
|
||||||
|
|
||||||
curv=SECP256k1.curve
|
|
||||||
|
|
||||||
#chall2*sk*ro2 - b*(y2.Gen-x2)
|
|
||||||
tb1=chall2*sk*ro2
|
|
||||||
|
|
||||||
x2=commit[1]
|
|
||||||
#x2=Point(x2.x(),x2.y())
|
|
||||||
Y2=SECP256k1.generator * y2
|
|
||||||
Y2=Point(Y2.x(),Y2.y())
|
|
||||||
X2=Point(x2.x(),x2.y())
|
|
||||||
XY2=Y2-X2
|
|
||||||
XY2 = - chall * XY2
|
|
||||||
|
|
||||||
assertion2 = tb1 + XY2
|
|
||||||
#Y3=Point(Y2.x(),Y2.y())
|
|
||||||
|
|
||||||
#chall*(Y2-x2)
|
|
||||||
#tb2 = chall*((SECP256k1.generator * y2) + invx2)
|
|
||||||
#Z2=Point(tb2.x(),-tb2.y())
|
|
||||||
|
|
||||||
#assertion2=tb1+Z2
|
|
||||||
|
|
||||||
|
|
||||||
#chall
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
print assertion1==assertion2
|
|
||||||
print assertion1.x()
|
|
||||||
print assertion2.x()
|
|
||||||
#Point(t1.x(),- t1.y())-Point(t1.x(),t1.y())
|
|
||||||
```
|
|
||||||
|
|
||||||
False
|
|
||||||
7736584874372799755670583036719701680498164259870020736174578513076009517175
|
|
||||||
26299729680235291815366724209282966839464132792531995892755583725140232542577
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user