实验目的
1、仔细阅读 curve.py 的源代码
2、理解每个函数之间的关系
3、熟悉椭圆曲线上的运算操作。
实验器材
1、编译器:Vscode
2、操作系统:windows10
3、编程语言:Python 3.10.11
4、库:ecc-pycrypto
实验原理
本次实验基于 Python 以及 ecc-pycrypto 库来实现。其中我们将使用ecc-pycrypto 库中的 P256 椭圆曲线的一个简单实现。
哈希函数
问题1
在Setup函数中g g g 表示P256的生成元,k k k 为随机数,计算得到h h h ,则K = ( g , h ) K=(g,h) K = ( g , h ) 即为生成的公钥对。而在Hash(G,H,M)中,利用离散对数构造Hash函数c = g m + h r c=g^m+h^r c = g m + h r 即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 from ecc.curve import P256import randomr = random.randint(1 , P256.n) def Setup (): k = random.randint(1 , P256.n) g = P256.G h = g * k return g, h def Hash (G, H, M ): h_0 = G * M + H * r return h_0 m = 51631313547153435441543815468315648351471524 6813546839164381543154687315413536418136456941835 g, h = Setup() h_0 = Hash(g, h, m) print ("r = " , r)print ("g = " , g)print ("h = " , h_0)print ("Hash(K, M) = " , h_0.x)
问题2
对SetupInsecure函数不仅产生哈希函数的密钥K,也输出离散对数k = l o g g ( h ) k=log_g(h) k = l o g g ( h ) ,在FindCol函数中利用X 2 + r 2 ∗ k = X 1 + r 1 ∗ k X_2+r_2*k=X_1+r_1*k X 2 + r 2 ∗ k = X 1 + r 1 ∗ k 找到一组哈希函数的碰撞。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 from ecc.curve import P256import randomr_1 = random.randint(1 , P256.n) r_2 = random.randint(1 , P256.n) def SetupInsecure (): k = random.randint(1 , P256.n) g = P256.G h = g * k return g, h, k def FindCol (G, H, K ): X_1 = 416513513415135313314146874688647846876487 4686487468469831483619865466849646815468175647815 X_2 = r_1 * K + X_1 - r_2 * K return X_1, X_2 def Hash (G, H, M, r ): h = G * M + H * r return h g, h, k = SetupInsecure() x_1, x_2 = FindCol(g, h, k) h_1 = Hash(g, h, x_1, r_1) h_2 = Hash(g, h, x_2, r_2) print ("x_1 = " , x_1)print ("x_2 = " , x_2)print ("r_1 = " , r_1)print ("r_2 = " , r_2)print ("g = " , g)print ("h = " , h)print ("k = " , k)print ("Hash(K, M) = " , h_1.x)print ("Hash(H, M) = " , h_2.x)if h_1 == h_2: print ("True" ) else : print ("False" )
零知识证明
问题3
在Prove函数中,首先计算R = g r R=g^r R = g r ,然后计算z = x ∗ h + r z=x*h+r z = x ∗ h + r ,最后返回R , h , z R,h,z R , h , z 。在Verif函数中,首先计算g z g^z g z 和f h ∗ R f^h*R f h ∗ R ,然后判断两者是否相等,若相等则返回True,否则返回False。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 import hashlibimport randomp = 15161 g = 3 x = 101 def Prove (): R = pow (g, r) h = random.randint(1 , p) z = x * h + r return R, h, z f = pow (g, x) def Verif (z, h ): if (pow (g, z) - pow (f, h) * R) % p != 0 : return True else : return False for i in range (1 , 100 ): r = random.randint(1 , p) R, h, z = Prove() if Verif(z, h): print ("证明失败" ) break print ("证明成功" )
问题4
假设Alice为证明者,拥有r r r ,Bob为验证者。Alice想要证明G = ( f , g , F = f r , G = g r ) G=(f,g,F=f^r,G=g^r) G = ( f , g , F = f r , G = g r )
是一个DDH关系,但不能透露关于r的任意消息,Bob想要验证Alice的证明。Alice和Bob
之间的交互如下:
1、Alice随机生成一个随机数k k k ,并将f ′ = f k {f}'=f^k f ′ = f k 和g ′ = g k {g}'=g^k g ′ = g k 发送给Bob。
2、Bob向Alice发送一个随机数s s s 。
3、Alice计算z = s + r k z=s+rk z = s + r k ,并将z z z 发送给Bob。
4、Bob验证f z = f s + F ∗ f ′ f^z=f^s+F*{f}' f z = f s + F ∗ f ′ 和g z = g s + G ∗ g ′ g^z=g^s+G*{g}' g z = g s + G ∗ g ′ 。
5、重复上述过程。
如果G = ( f , g , F , G ) G=(f,g,F,G) G = ( f , g , F , G ) 不存在DDH关系,那么假设F = f r 1 , G = g r 2 F=f^{r_1},G=g^{r_2} F = f r 1 , G = g r 2 ,Alice想要通过验证,就需要让f ′ {f}' f ′ 和g ′ {g}' g ′ 同时对两个不同的s 1 s_1 s 1 和s 2 s_2 s 2 都能应答z 1 1 , z 1 2 , z 2 1 , z 2 2 z_11,z_12,z_21,z_22 z 1 1 , z 1 2 , z 2 1 , z 2 2 ,那么r = z 11 − z 12 s 1 − s 2 = z 21 − z 22 s 1 − s 2 r=\frac{z_{11}-z_{12}}{s_1-s_2}=\frac{z_{21}-z_{22}}{s_1-s_2} r = s 1 − s 2 z 1 1 − z 1 2 = s 1 − s 2 z 2 1 − z 2 2 ,由于s 1 , s 2 s_1,s_2 s 1 , s 2 都是Bob随机选取的,于是Alice就需要以猜测穷举离散对数的空间复杂度获得满足条件的s s s 。因此,如果Alice能够通过验证,那么G G G 一定是一个DDH关系。
问题5
在Prove函数中,首先计算f ′ = f k 1 , g ′ = g k 2 f'=f^{k_1},g'=g^{k_2} f ′ = f k 1 , g ′ = g k 2 ,然后计算z 1 = s + r k 1 , z 2 = s + r k 2 z_1=s+rk_1,z_2=s+rk_2 z 1 = s + r k 1 , z 2 = s + r k 2 ,最后返回f ′ , g ′ , z 1 , z 2 f',g',z_1,z_2 f ′ , g ′ , z 1 , z 2 。在Verif函数中,首先计算f z 1 f^{z_1} f z 1 和f s + F ∗ f ′ f^s+F*f' f s + F ∗ f ′ ,然后计算g z 2 g^{z_2} g z 2 和g s + G ∗ g ′ g^s+G*g' g s + G ∗ g ′ ,最后判断两者是否相等,若相等则返回True,否则返回False。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import randomp = 15161 f = 3 g = 5 r = 101 def Prove (s ): k_1 = random.randint(1 , p) k_2 = random.randint(1 , p) f_ = pow (f, k_1) g_ = pow (g, k_2) z_1 = s + r * k_1 z_2 = s + r * k_2 return f_, g_, z_1, z_2 F = pow (f, r) G = pow (g, r) def Verif (f_, g_, z_1, z_2, s ): if (pow (f, z_1) - pow (f, s) * f_) % p == 0 and ( pow (g, z_2) - pow (g, s) * g_ ) % p == 0 : return True else : return False for i in range (1 , 100 ): s = random.randint(1 , p) f_, g_, z_1, z_2 = Prove(s) if Verif(f_, g_, z_1, z_2, s): print ("证明失败" ) break print ("证明成功" )