Merge pull request 'main' (#10) from sangge/mimajingsai:main into main
Reviewed-on: ccyj/mimajingsai#10
This commit is contained in:
commit
ccb4287671
1
.gitignore
vendored
1
.gitignore
vendored
@ -6,4 +6,3 @@ test.py
|
|||||||
example.py
|
example.py
|
||||||
|
|
||||||
ReEncrypt.py
|
ReEncrypt.py
|
||||||
src/demo.py
|
|
||||||
|
3
src/demo.py
Normal file
3
src/demo.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from tpre import *
|
||||||
|
|
||||||
|
|
57
src/tpre.py
57
src/tpre.py
@ -126,27 +126,6 @@ def jacobianMultiply(
|
|||||||
# 生成元
|
# 生成元
|
||||||
U = multiply(g, random.randint(0, sm2p256v1.P))
|
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
|
|
||||||
# '''
|
|
||||||
|
|
||||||
# G = sm2p256v1
|
|
||||||
|
|
||||||
# g = (sm2p256v1.Gx, sm2p256v1.Gy)
|
|
||||||
|
|
||||||
# tmp_u = random.randint(0, sm2p256v1.P)
|
|
||||||
# U = multiply(g, tmp_u)
|
|
||||||
|
|
||||||
# return G, g, U
|
|
||||||
|
|
||||||
def hash2(double_G: Tuple[Tuple[int, int], Tuple[int, int]]) -> int:
|
def hash2(double_G: Tuple[Tuple[int, int], Tuple[int, int]]) -> int:
|
||||||
sm3 = Sm3() #pylint: disable=e0602
|
sm3 = Sm3() #pylint: disable=e0602
|
||||||
for i in double_G:
|
for i in double_G:
|
||||||
@ -214,8 +193,8 @@ def GenerateKeyPair(
|
|||||||
return public_key, secret_key
|
return public_key, secret_key
|
||||||
|
|
||||||
# 生成A和B的公钥和私钥
|
# 生成A和B的公钥和私钥
|
||||||
pk_A, sk_A = GenerateKeyPair(0, ())
|
#pk_A, sk_A = GenerateKeyPair(0, ())
|
||||||
pk_B, sk_B = GenerateKeyPair(0, ())
|
#pk_B, sk_B = GenerateKeyPair(0, ())
|
||||||
|
|
||||||
def Encrypt(pk: Tuple[int, int], m: int) -> Tuple[Tuple[
|
def Encrypt(pk: Tuple[int, int], m: int) -> Tuple[Tuple[
|
||||||
Tuple[int, int],Tuple[int, int], int], int]:
|
Tuple[int, int],Tuple[int, int], int], int]:
|
||||||
@ -255,7 +234,7 @@ def Decrypt(sk_A: int,C:Tuple[Tuple[
|
|||||||
return dec_Data
|
return dec_Data
|
||||||
|
|
||||||
# GenerateRekey
|
# GenerateRekey
|
||||||
def H5(id: int, D: int) -> int:
|
def hash5(id: int, D: int) -> int:
|
||||||
sm3 = Sm3() #pylint: disable=e0602
|
sm3 = Sm3() #pylint: disable=e0602
|
||||||
sm3.update(id.to_bytes(32))
|
sm3.update(id.to_bytes(32))
|
||||||
sm3.update(D.to_bytes(32))
|
sm3.update(D.to_bytes(32))
|
||||||
@ -263,7 +242,7 @@ def H5(id: int, D: int) -> int:
|
|||||||
hash = int.from_bytes(hash,'big') % G.P
|
hash = int.from_bytes(hash,'big') % G.P
|
||||||
return hash
|
return hash
|
||||||
|
|
||||||
def H6(triple_G: Tuple[Tuple[int, int],
|
def hash6(triple_G: Tuple[Tuple[int, int],
|
||||||
Tuple[int, int],
|
Tuple[int, int],
|
||||||
Tuple[int, int]]) -> int:
|
Tuple[int, int]]) -> int:
|
||||||
sm3 = Sm3() #pylint: disable=e0602
|
sm3 = Sm3() #pylint: disable=e0602
|
||||||
@ -275,6 +254,9 @@ def H6(triple_G: Tuple[Tuple[int, int],
|
|||||||
return hash
|
return hash
|
||||||
|
|
||||||
def f(x: int, f_modulus: list, T: int) -> int:
|
def f(x: int, f_modulus: list, T: int) -> int:
|
||||||
|
'''
|
||||||
|
|
||||||
|
'''
|
||||||
res = 0
|
res = 0
|
||||||
for i in range(T):
|
for i in range(T):
|
||||||
res += f_modulus[i] * pow(x, i)
|
res += f_modulus[i] * pow(x, i)
|
||||||
@ -304,14 +286,14 @@ def GenerateReKey(sk_A, pk_B, N: int, T: int) -> list:
|
|||||||
f_modulus.append(random.randint(0, G.P - 1))
|
f_modulus.append(random.randint(0, G.P - 1))
|
||||||
|
|
||||||
# 计算D
|
# 计算D
|
||||||
D = H6((X_A, pk_B, multiply(pk_B, sk_A)))
|
D = hash6((X_A, pk_B, multiply(pk_B, sk_A)))
|
||||||
|
|
||||||
# 计算KF
|
# 计算KF
|
||||||
KF = []
|
KF = []
|
||||||
for i in range(N):
|
for i in range(N):
|
||||||
y = random.randint(0, G.P - 1)
|
y = random.randint(0, G.P - 1)
|
||||||
Y = multiply(g, y)
|
Y = multiply(g, y)
|
||||||
s_x = H5(i, D) # id需要设置
|
s_x = hash5(i, D) # id需要设置
|
||||||
r_k = f(s_x, f_modulus, T)
|
r_k = f(s_x, f_modulus, T)
|
||||||
U1 = multiply(U, r_k)
|
U1 = multiply(U, r_k)
|
||||||
kFrag = (i, r_k, X_A, U1)
|
kFrag = (i, r_k, X_A, U1)
|
||||||
@ -367,7 +349,8 @@ def ReEncrypt(kFrag:list,
|
|||||||
|
|
||||||
|
|
||||||
# N 是加密节点的数量,t是阈值
|
# N 是加密节点的数量,t是阈值
|
||||||
def mergecfrag(N:int,t:int)->tuple[Tuple[Tuple[int,int],Tuple[int,int]
|
def mergecfrag(sk_A: int, pk_A: Tuple[int, int], pk_B: Tuple[int, int],
|
||||||
|
N: int, t: int)->tuple[Tuple[Tuple[int,int],Tuple[int,int]
|
||||||
,int,Tuple[int,int]], ...]:
|
,int,Tuple[int,int]], ...]:
|
||||||
cfrags = ()
|
cfrags = ()
|
||||||
kfrags = GenerateReKey(sk_A,pk_B,N,t)
|
kfrags = GenerateReKey(sk_A,pk_B,N,t)
|
||||||
@ -381,8 +364,11 @@ def mergecfrag(N:int,t:int)->tuple[Tuple[Tuple[int,int],Tuple[int,int]
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def DecapsulateFrags(sk_B:int,pk_A:Tuple[int,int],cFrags:Tuple[Tuple[Tuple[int,int],Tuple[int,int],int,Tuple[int,int]]]
|
def DecapsulateFrags(sk_B:int,
|
||||||
,capsule:Tuple[Tuple[int,int],Tuple[int,int],int]) -> int:
|
pk_B: Tuple[int, int],
|
||||||
|
pk_A:Tuple[int,int],
|
||||||
|
cFrags:Tuple[Tuple[Tuple[int,int],Tuple[int,int],int,Tuple[int,int]]]
|
||||||
|
) -> int:
|
||||||
'''
|
'''
|
||||||
return:
|
return:
|
||||||
K: sm4 key
|
K: sm4 key
|
||||||
@ -400,10 +386,10 @@ def DecapsulateFrags(sk_B:int,pk_A:Tuple[int,int],cFrags:Tuple[Tuple[Tuple[int,i
|
|||||||
t = t+1 # 总共有t个片段,t为阈值
|
t = t+1 # 总共有t个片段,t为阈值
|
||||||
|
|
||||||
pkab = multiply(pk_A,sk_B) # pka^b
|
pkab = multiply(pk_A,sk_B) # pka^b
|
||||||
D = H6((pk_A,pk_B,pkab))
|
D = hash6((pk_A,pk_B,pkab))
|
||||||
Sx = []
|
Sx = []
|
||||||
for id in idlist: # 从1到t
|
for id in idlist: # 从1到t
|
||||||
sxi = H5(id,D) # id 节点的编号
|
sxi = hash5(id,D) # id 节点的编号
|
||||||
Sx.append(sxi)
|
Sx.append(sxi)
|
||||||
bis= [] # b ==> λ
|
bis= [] # b ==> λ
|
||||||
j = 1
|
j = 1
|
||||||
@ -424,8 +410,8 @@ def DecapsulateFrags(sk_B:int,pk_A:Tuple[int,int],cFrags:Tuple[Tuple[Tuple[int,i
|
|||||||
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(Xalist[0],b) # X_A^b X_A 的值是随机生成的xa,通过椭圆曲线上的倍点运算生成的固定的值
|
X_Ab = multiply(X_Alist[0],sk_B) # X_A^b X_A 的值是随机生成的xa,通过椭圆曲线上的倍点运算生成的固定的值
|
||||||
d = hash3((Xalist[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
|
||||||
K = KDF(EVd)
|
K = KDF(EVd)
|
||||||
@ -435,12 +421,13 @@ def DecapsulateFrags(sk_B:int,pk_A:Tuple[int,int],cFrags:Tuple[Tuple[Tuple[int,i
|
|||||||
# M = IAEAM(K,enc_Data)
|
# M = IAEAM(K,enc_Data)
|
||||||
|
|
||||||
def DecryptFrags(sk_B: int,
|
def DecryptFrags(sk_B: int,
|
||||||
|
pk_B: Tuple[int, int],
|
||||||
pk_A: Tuple[int,int],
|
pk_A: Tuple[int,int],
|
||||||
cFrags: Tuple[Tuple[Tuple[int,int],Tuple[int,int],int,Tuple[int,int]]],
|
cFrags: Tuple[Tuple[Tuple[int,int],Tuple[int,int],int,Tuple[int,int]]],
|
||||||
C: Tuple[Tuple[Tuple[int,int],Tuple[int,int],int],int]
|
C: Tuple[Tuple[Tuple[int,int],Tuple[int,int],int],int]
|
||||||
) -> int:
|
) -> int:
|
||||||
capsule,enc_Data = C # 加密后的密文
|
capsule,enc_Data = C # 加密后的密文
|
||||||
K = DecapsulateFrags(sk_B,pk_A,cFrags,capsule)
|
K = DecapsulateFrags(sk_B, pk_B, pk_A,cFrags)
|
||||||
|
|
||||||
iv = b'tpretpretpretpre'
|
iv = b'tpretpretpretpre'
|
||||||
sm4_dec = Sm4Cbc(K, iv, DO_DECRYPT) #pylint: disable= e0602
|
sm4_dec = Sm4Cbc(K, iv, DO_DECRYPT) #pylint: disable= e0602
|
||||||
|
Loading…
x
Reference in New Issue
Block a user