Compare commits

...

2 Commits

Author SHA1 Message Date
a196530fde perf: rewrite DecapsulateFrags 2023-10-18 16:02:21 +08:00
a68fcf1eec style: replace chinese comma 2023-10-18 15:28:31 +08:00

View File

@ -213,7 +213,7 @@ def GenerateKeyPair(lamda_parma: int, public_params: tuple) -> Tuple[point, int]
# pk_B, sk_B = GenerateKeyPair(0, ()) # pk_B, sk_B = GenerateKeyPair(0, ())
def Encrypt(pk: point, m: bytes) -> Tuple[Tuple[point, point, int], bytes]: def Encrypt(pk: point, m: bytes) -> Tuple[capsule, bytes]:
enca = Encapsulate(pk) enca = Encapsulate(pk)
K = enca[0].to_bytes(16) K = enca[0].to_bytes(16)
capsule = enca[1] capsule = enca[1]
@ -351,7 +351,7 @@ def ReEncapsulate(kFrag: list, capsule: capsule) -> Tuple[point, point, int, poi
if not Checkcapsule(capsule): if not Checkcapsule(capsule):
raise ValueError("Invalid capsule") raise ValueError("Invalid capsule")
flag = Checkcapsule(capsule) flag = Checkcapsule(capsule)
assert flag == True # 断言判断胶囊capsule的有效性 assert flag == True # 断言,判断胶囊capsule的有效性
E1 = multiply(E, rk) E1 = multiply(E, rk)
V1 = multiply(V, rk) V1 = multiply(V, rk)
cfrag = E1, V1, id, Xa cfrag = E1, V1, id, Xa
@ -361,8 +361,8 @@ def ReEncapsulate(kFrag: list, capsule: capsule) -> Tuple[point, point, int, poi
def ReEncrypt( def ReEncrypt(
kFrag: list, C: Tuple[capsule, int] kFrag: list, C: Tuple[capsule, bytes]
) -> Tuple[Tuple[point, point, int, point], int]: ) -> Tuple[Tuple[point, point, int, point], bytes]:
capsule, enc_Data = C capsule, enc_Data = C
cFrag = ReEncapsulate(kFrag, capsule) cFrag = ReEncapsulate(kFrag, capsule)
@ -372,7 +372,7 @@ def ReEncrypt(
# capsule, enc_Data = C # capsule, enc_Data = C
# 将加密节点加密后产生的t个capsule,ct合并在一起产生cfrags = {{capsule1,capsule2,...},ct} # 将加密节点加密后产生的t个capsule,ct合并在一起,产生cfrags = {{capsule1,capsule2,...},ct}
def mergecfrag(cfrag_cts: list) -> list: def mergecfrag(cfrag_cts: list) -> list:
ct_list = [] ct_list = []
cfrags_list = [] cfrags_list = []
@ -395,13 +395,11 @@ def DecapsulateFrags(sk_B: int, pk_B: point, pk_A: point, cFrags: list) -> int:
Vlist = [] Vlist = []
idlist = [] idlist = []
X_Alist = [] X_Alist = []
t = 0
for cfrag in cFrags: # Ei,Vi,id,Xa = cFrag for cfrag in cFrags: # Ei,Vi,id,Xa = cFrag
Elist.append(cfrag[0]) Elist.append(cfrag[0])
Vlist.append(cfrag[1]) Vlist.append(cfrag[1])
idlist.append(cfrag[2]) idlist.append(cfrag[2])
X_Alist.append(cfrag[3]) X_Alist.append(cfrag[3])
t = t + 1 # 总共有t个片段t为阈值
pkab = multiply(pk_A, sk_B) # pka^b pkab = multiply(pk_A, sk_B) # pka^b
D = hash6((pk_A, pk_B, pkab)) D = hash6((pk_A, pk_B, pkab))
@ -413,23 +411,23 @@ def DecapsulateFrags(sk_B: int, pk_B: point, pk_A: point, cFrags: list) -> int:
j = 1 j = 1
i = 1 i = 1
bi = 1 bi = 1
for i in range(t): for i in range(len(cFrags)):
for j in range(t): for j in range(len(cFrags)):
if j == i: if j != i:
# j=j+1 # bi = bi * (Sx[j] // (Sx[j] - Sx[i])) # 暂定整除
continue Sxj_sub_Sxi = (Sx[j] - Sx[i]) % sm2p256v1.P
else: Sxj_sub_Sxi_inv = inv(Sxj_sub_Sxi, sm2p256v1.P)
bi = bi * (Sx[j] // (Sx[j] - Sx[i])) # 暂定整除 bi = (bi * Sx[j] * Sxj_sub_Sxi_inv) % sm2p256v1.P
bis.append(bi) bis.append(bi)
E2 = multiply(Elist[0], bis[0]) # E^ 便于计算 E2 = multiply(Elist[0], bis[0]) # E^ 便于计算
V2 = multiply(Vlist[0], bis[0]) # V^ V2 = multiply(Vlist[0], bis[0]) # V^
for k in range(1, t): for k in range(1, len(cFrags)):
Ek = multiply(Elist[k], bis[k]) # EK/Vk 是个列表 Ek = multiply(Elist[k], bis[k]) # EK/Vk 是个列表
Vk = multiply(Vlist[k], bis[k]) Vk = multiply(Vlist[k], bis[k])
E2 = add(Ek, E2) E2 = add(Ek, E2)
V2 = add(Vk, V2) V2 = add(Vk, V2)
X_Ab = multiply(X_Alist[0], sk_B) # X_A^b X_A 的值是随机生成的xa通过椭圆曲线上的倍点运算生成的固定的值 X_Ab = multiply(X_Alist[0], sk_B) # X_A^b X_A 的值是随机生成的xa,通过椭圆曲线上的倍点运算生成的固定的值
d = hash3((X_Alist[0], pk_B, X_Ab)) d = hash3((X_Alist[0], pk_B, X_Ab))
EV = add(E2, V2) # E2 + V2 EV = add(E2, V2) # E2 + V2
EVd = multiply(EV, d) # (E2 + V2)^d EVd = multiply(EV, d) # (E2 + V2)^d