diff --git a/src/tpre.py b/src/tpre.py index f4b8a85..b9d782d 100644 --- a/src/tpre.py +++ b/src/tpre.py @@ -22,6 +22,9 @@ sm2p256v1 = CurveFp( Gx=0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7, Gy=0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0 ) + +# sec需要重新设置 +sec = 256 def multiply(a: Tuple[int, int], n: int) -> Tuple[int, int]: N = sm2p256v1.N @@ -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 \ No newline at end of file + 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) \ No newline at end of file