forked from sangge/tpre-python
		
	main #7
							
								
								
									
										85
									
								
								src/tpre.py
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								src/tpre.py
									
									
									
									
									
								
							| @@ -23,6 +23,9 @@ sm2p256v1 = CurveFp( | ||||
|     Gy=0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0 | ||||
| ) | ||||
|  | ||||
| # sec需要重新设置 | ||||
| sec = 256   | ||||
|   | ||||
| def multiply(a: Tuple[int, int], n: int) -> Tuple[int, int]: | ||||
|     N = sm2p256v1.N | ||||
|     A = sm2p256v1.A | ||||
| @@ -146,7 +149,7 @@ def Setup(sec: int) -> Tuple[CurveFp, Tuple[int, int], | ||||
|         sm3 = Sm3() #pylint: disable=e0602 | ||||
|         for i in double_G: | ||||
|             for j in i: | ||||
|                 sm3.update(j.to_bytes()) | ||||
|                 sm3.update(j.to_bytes(32)) | ||||
|         digest = sm3.digest() | ||||
|         digest = int.from_bytes(digest,'big') % sm2p256v1.P | ||||
|         return digest | ||||
| @@ -157,7 +160,7 @@ def Setup(sec: int) -> Tuple[CurveFp, Tuple[int, int], | ||||
|         sm3 = Sm3() #pylint: disable=e0602 | ||||
|         for i in triple_G: | ||||
|             for j in i: | ||||
|                 sm3.update(j.to_bytes()) | ||||
|                 sm3.update(j.to_bytes(32)) | ||||
|         digest = sm3.digest() | ||||
|         digest = int.from_bytes(digest,'big') % sm2p256v1.P | ||||
|         return digest | ||||
| @@ -169,8 +172,8 @@ def Setup(sec: int) -> Tuple[CurveFp, Tuple[int, int], | ||||
|         sm3 = Sm3() #pylint: disable=e0602 | ||||
|         for i in triple_G: | ||||
|             for j in i: | ||||
|                 sm3.update(j.to_bytes()) | ||||
|         sm3.update(Zp.to_bytes()) | ||||
|                 sm3.update(j.to_bytes(32)) | ||||
|         sm3.update(Zp.to_bytes(32)) | ||||
|         digest = sm3.digest() | ||||
|         digest = int.from_bytes(digest,'big') % sm2p256v1.P | ||||
|         return digest | ||||
| @@ -211,8 +214,80 @@ def Enc(pk: Tuple[int, int], m: int) -> Tuple[Tuple[ | ||||
|     capsule = enca[1] | ||||
|      | ||||
|     sm4_enc = Sm4Cbc(key, iv, DO_ENCRYPT) #pylint: disable=e0602 | ||||
|     plain_Data = m.to_bytes() | ||||
|     plain_Data = m.to_bytes(32) | ||||
|     enc_Data = sm4_enc.update(plain_Data) | ||||
|     enc_Data += sm4_enc.finish() | ||||
|     enc_message = (capsule, enc_Data) | ||||
|     return enc_message | ||||
|  | ||||
| # GenerateRekey | ||||
| def H5(id: int, D: int) -> int: | ||||
|     sm3 = Sm3() | ||||
|     sm3.update(id.to_bytes(32)) | ||||
|     sm3.update(D.to_bytes(32)) | ||||
|     hash = sm3.digest() | ||||
|     hash = int.from_bytes(hash,'big') % G.P | ||||
|     return hash | ||||
|  | ||||
| def H6(triple_G: Tuple[Tuple[int, int],  | ||||
|                               Tuple[int, int], | ||||
|                               Tuple[int, int]]) -> int: | ||||
|         sm3 = Sm3() #pylint: disable=e0602 | ||||
|         for i in triple_G: | ||||
|             for j in i: | ||||
|                 sm3.update(j.to_bytes(32)) | ||||
|         hash = sm3.digest() | ||||
|         hash = int.from_bytes(hash,'big') % G.P | ||||
|         return hash | ||||
|  | ||||
| def f(x: int, f_modulus: list, T: int) -> int: | ||||
|     res = 0 | ||||
|     for i in range(T): | ||||
|         res += f_modulus[i] * pow(x, i) | ||||
|     return res | ||||
|  | ||||
| def GenerateReKey(N: int, T: int) -> list: | ||||
|     ''' | ||||
|     param: skA, pkB, N(节点总数), T(阈值) | ||||
|     return rki(0 <= i <= N-1) | ||||
|     ''' | ||||
|     g_a, a = GenerateKeyPair(0, ()) | ||||
|     g_b, b = GenerateKeyPair(0, ()) | ||||
|     # 计算临时密钥对(x_A, X_A) | ||||
|     x_A = random.randint(0, G.P - 1) | ||||
|     X_A = multiply(g, x_A)                 | ||||
|  | ||||
|     # d是Bob的密钥对与临时密钥对的非交互式Diffie-Hellman密钥交换的结果 | ||||
|     d = hash3((X_A, multiply(g, b), multiply(g, b * x_A)))    | ||||
|      | ||||
|     # 计算多项式系数, 确定代理节点的ID(一个点) | ||||
|     f_modulus = [] | ||||
|     # 计算f0 | ||||
|     f0 = (a * inv(d, G.P)) % G.P | ||||
|     f_modulus.append(f0) | ||||
|     # 计算fi(1 <= i <= T - 1) | ||||
|     for i in range(1, T): | ||||
|         f_modulus.append(random.randint(0, G.P - 1)) | ||||
|  | ||||
|     # 计算D | ||||
|     D = H6((X_A, multiply(g, b), multiply(g, b * a))) | ||||
|  | ||||
|     # 计算KF | ||||
|     KF = [] | ||||
|     for i in range(N): | ||||
|         y = random.randint(0, G.P - 1) | ||||
|         Y = multiply(g, y) | ||||
|         s_x = H5(i, D)         # id需要设置 | ||||
|         r_k = f(s_x, f_modulus, T) | ||||
|         U1 = multiply(U, r_k)    | ||||
|         kFrag = (i, r_k, X_A, U1) | ||||
|         KF.append(kFrag) | ||||
|  | ||||
|     return KF | ||||
|  | ||||
| # 测试GenerateReky函数 | ||||
| # G, g, U, hash2, hash3, hash4, KDF = Setup(sec) | ||||
| # KF = GenerateReKey(30, 20) | ||||
| # for i in KF: | ||||
| #     for j in i: | ||||
| #         print(j) | ||||
		Reference in New Issue
	
	Block a user