From cd1e88471360e51de5649174220acb18a93fc40d Mon Sep 17 00:00:00 2001 From: sangge <2251250136@qq.com> Date: Mon, 16 Oct 2023 22:30:15 +0800 Subject: [PATCH 1/3] fix: extract hash and kdf from setup --- src/tpre.py | 96 +++++++++++++++++++++++++---------------------------- 1 file changed, 45 insertions(+), 51 deletions(-) diff --git a/src/tpre.py b/src/tpre.py index aca6a7c..cbd3969 100644 --- a/src/tpre.py +++ b/src/tpre.py @@ -118,8 +118,7 @@ def jacobianMultiply( raise ValueError("jacobian Multiply error") def Setup(sec: int) -> Tuple[CurveFp, Tuple[int, int], - Tuple[int, int], Callable, - Callable, Callable, Callable]: + Tuple[int, int]]: ''' params: sec: an init safety param @@ -128,10 +127,6 @@ def Setup(sec: int) -> Tuple[CurveFp, Tuple[int, int], G: sm2 curve g: generator U: another generator - use sm3 as hash function - hash2: G^2 -> Zq - hash3: G^3 -> Zq - hash4: G^3 * Zq -> Zq ''' G = sm2p256v1 @@ -141,50 +136,49 @@ def Setup(sec: int) -> Tuple[CurveFp, Tuple[int, int], tmp_u = random.randint(0, sm2p256v1.P) U = multiply(g, tmp_u) - def hash2(double_G: Tuple[Tuple[int, int], Tuple[int, int]]) -> int: - sm3 = Sm3() #pylint: disable=e0602 - for i in double_G: - for j in i: - sm3.update(j.to_bytes(32)) - digest = sm3.digest() - digest = int.from_bytes(digest,'big') % sm2p256v1.P - return digest - - def hash3(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)) - digest = sm3.digest() - digest = int.from_bytes(digest, 'big') % sm2p256v1.P - return digest - - def hash4(triple_G: Tuple[Tuple[int, int], - Tuple[int, int], - Tuple[int, int]], - Zp: int) -> int: - sm3 = Sm3() #pylint: disable=e0602 - for i in triple_G: - for j in i: - 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 - - def KDF(G: Tuple[int, int]) -> int: - sm3 = Sm3() #pylint: disable=e0602 - for i in G: - sm3.update(i.to_bytes(32)) - digest = sm3.digest(32) - digest = digest - digest = int.from_bytes(digest, 'big') % sm2p256v1.P - return digest - - - return G, g, U, hash2, hash3, hash4, KDF + return G, g, U + +def hash2(double_G: Tuple[Tuple[int, int], Tuple[int, int]]) -> int: + sm3 = Sm3() #pylint: disable=e0602 + for i in double_G: + for j in i: + sm3.update(j.to_bytes(32)) + digest = sm3.digest() + digest = int.from_bytes(digest,'big') % sm2p256v1.P + return digest + +def hash3(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)) + digest = sm3.digest() + digest = int.from_bytes(digest, 'big') % sm2p256v1.P + return digest + +def hash4(triple_G: Tuple[Tuple[int, int], + Tuple[int, int], + Tuple[int, int]], + Zp: int) -> int: + sm3 = Sm3() #pylint: disable=e0602 + for i in triple_G: + for j in i: + 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 + +def KDF(G: Tuple[int, int]) -> int: + sm3 = Sm3() #pylint: disable=e0602 + for i in G: + sm3.update(i.to_bytes(32)) + digest = sm3.digest(32) + digest = digest + digest = int.from_bytes(digest, 'big') % sm2p256v1.P + return digest def GenerateKeyPair( lamda_parma: int, @@ -281,7 +275,7 @@ pk_B, sk_B = GenerateKeyPair(0, ()) sec = 256 # 调用Setup函数 -G, g, U, hash2, hash3, hash4, KDF = Setup(sec) +G, g, U= Setup(sec) def GenerateReKey(sk_A, pk_B, N: int, T: int) -> list: ''' From c2eba8a0bfa700eb9b365bed0a88a2d58ac99e6f Mon Sep 17 00:00:00 2001 From: dqy <1016751306@qq.com> Date: Tue, 17 Oct 2023 21:02:55 +0800 Subject: [PATCH 2/3] =?UTF-8?q?perf:=20=E6=B3=A8=E9=87=8A=E6=8E=89Setup?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=B9=B6=E5=B0=86G,=20g,=20U=E8=BD=AC?= =?UTF-8?q?=E5=8C=96=E4=B8=BA=E5=85=A8=E5=B1=80=E5=8F=98=E9=87=8F=EF=BC=9B?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0demo.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tpre.py | 57 ++++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/src/tpre.py b/src/tpre.py index 25e9093..d8a002e 100644 --- a/src/tpre.py +++ b/src/tpre.py @@ -22,7 +22,13 @@ sm2p256v1 = CurveFp( Gx=0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7, Gy=0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0 ) - + +# 椭圆曲线 +G = sm2p256v1 + +# 生成元 +g = (sm2p256v1.Gx, sm2p256v1.Gy) + def multiply(a: Tuple[int, int], n: int) -> Tuple[int, int]: N = sm2p256v1.N A = sm2p256v1.A @@ -116,27 +122,30 @@ def jacobianMultiply( if (n % 2) == 1: return jacobianAdd(jacobianDouble(jacobianMultiply((Xp, Yp, Zp), n // 2, N, A, P), A, P), (Xp, Yp, Zp), A, P) raise ValueError("jacobian Multiply error") - -def Setup(sec: int) -> Tuple[CurveFp, Tuple[int, int], - Tuple[int, int]]: - ''' - params: - sec: an init safety param + +# 生成元 +U = multiply(g, random.randint(0, sm2p256v1.P)) + +# def Setup(sec: int) -> Tuple[CurveFp, Tuple[int, int], +# Tuple[int, int]]: +# ''' +# params: +# sec: an init safety param - return: - G: sm2 curve - g: generator - U: another generator - ''' +# return: +# G: sm2 curve +# g: generator +# U: another generator +# ''' - G = sm2p256v1 +# G = sm2p256v1 - g = (sm2p256v1.Gx, sm2p256v1.Gy) +# g = (sm2p256v1.Gx, sm2p256v1.Gy) - tmp_u = random.randint(0, sm2p256v1.P) - U = multiply(g, tmp_u) +# tmp_u = random.randint(0, sm2p256v1.P) +# U = multiply(g, tmp_u) - return G, g, U +# return G, g, U def hash2(double_G: Tuple[Tuple[int, int], Tuple[int, int]]) -> int: sm3 = Sm3() #pylint: disable=e0602 @@ -204,6 +213,10 @@ def GenerateKeyPair( return public_key, secret_key +# 生成A和B的公钥和私钥 +pk_A, sk_A = GenerateKeyPair(0, ()) +pk_B, sk_B = GenerateKeyPair(0, ()) + def Encrypt(pk: Tuple[int, int], m: int) -> Tuple[Tuple[ Tuple[int, int],Tuple[int, int], int], int]: enca = Encapsulate(pk) @@ -267,16 +280,6 @@ def f(x: int, f_modulus: list, T: int) -> int: res += f_modulus[i] * pow(x, i) return res -# 生成A和B的公钥和私钥 -pk_A, sk_A = GenerateKeyPair(0, ()) -pk_B, sk_B = GenerateKeyPair(0, ()) - -# sec需要重新设置 -sec = 256 - -# 调用Setup函数 -G, g, U= Setup(sec) - def GenerateReKey(sk_A, pk_B, N: int, T: int) -> list: ''' param: From aeca5c6772f44feb06eba24e010c4db897e40e0f Mon Sep 17 00:00:00 2001 From: dqy <1016751306@qq.com> Date: Tue, 17 Oct 2023 21:06:31 +0800 Subject: [PATCH 3/3] =?UTF-8?q?perf:=20=E5=88=A0=E9=99=A4demo.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tpre.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tpre.py b/src/tpre.py index d8a002e..a4eacd5 100644 --- a/src/tpre.py +++ b/src/tpre.py @@ -344,7 +344,6 @@ def Checkcapsule(capsule:Tuple[Tuple[int,int],Tuple[int,int],int]) -> bool: # return flag - def ReEncapsulate(kFrag:list,capsule:Tuple[Tuple[int,int],Tuple[int,int],int]) -> Tuple[Tuple[int,int],Tuple[int,int],int,Tuple[int,int]] : id,rk,Xa,U1 = kFrag E,V,s = capsule