forked from sangge/tpre-python
Merge pull request 'main' (#9) from sangge/mimajingsai:main into main
Reviewed-on: #9
This commit is contained in:
commit
523bae52a9
148
src/tpre.py
148
src/tpre.py
@ -22,7 +22,13 @@ sm2p256v1 = CurveFp(
|
|||||||
Gx=0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7,
|
Gx=0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7,
|
||||||
Gy=0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0
|
Gy=0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 椭圆曲线
|
||||||
|
G = sm2p256v1
|
||||||
|
|
||||||
|
# 生成元
|
||||||
|
g = (sm2p256v1.Gx, sm2p256v1.Gy)
|
||||||
|
|
||||||
def multiply(a: Tuple[int, int], n: int) -> Tuple[int, int]:
|
def multiply(a: Tuple[int, int], n: int) -> Tuple[int, int]:
|
||||||
N = sm2p256v1.N
|
N = sm2p256v1.N
|
||||||
A = sm2p256v1.A
|
A = sm2p256v1.A
|
||||||
@ -116,75 +122,72 @@ def jacobianMultiply(
|
|||||||
if (n % 2) == 1:
|
if (n % 2) == 1:
|
||||||
return jacobianAdd(jacobianDouble(jacobianMultiply((Xp, Yp, Zp), n // 2, N, A, P), A, P), (Xp, Yp, Zp), A, P)
|
return jacobianAdd(jacobianDouble(jacobianMultiply((Xp, Yp, Zp), n // 2, N, A, P), A, P), (Xp, Yp, Zp), A, P)
|
||||||
raise ValueError("jacobian Multiply error")
|
raise ValueError("jacobian Multiply error")
|
||||||
|
|
||||||
def Setup(sec: int) -> Tuple[CurveFp, Tuple[int, int],
|
# 生成元
|
||||||
Tuple[int, int], Callable,
|
U = multiply(g, random.randint(0, sm2p256v1.P))
|
||||||
Callable, Callable, Callable]:
|
|
||||||
'''
|
# def Setup(sec: int) -> Tuple[CurveFp, Tuple[int, int],
|
||||||
params:
|
# Tuple[int, int]]:
|
||||||
sec: an init safety param
|
# '''
|
||||||
|
# params:
|
||||||
|
# sec: an init safety param
|
||||||
|
|
||||||
return:
|
# return:
|
||||||
G: sm2 curve
|
# G: sm2 curve
|
||||||
g: generator
|
# g: generator
|
||||||
U: another generator
|
# U: another generator
|
||||||
use sm3 as hash function
|
# '''
|
||||||
hash2: G^2 -> Zq
|
|
||||||
hash3: G^3 -> Zq
|
|
||||||
hash4: G^3 * Zq -> Zq
|
|
||||||
'''
|
|
||||||
|
|
||||||
G = sm2p256v1
|
# G = sm2p256v1
|
||||||
|
|
||||||
g = (sm2p256v1.Gx, sm2p256v1.Gy)
|
# g = (sm2p256v1.Gx, sm2p256v1.Gy)
|
||||||
|
|
||||||
tmp_u = random.randint(0, sm2p256v1.P)
|
# tmp_u = random.randint(0, sm2p256v1.P)
|
||||||
U = multiply(g, tmp_u)
|
# U = multiply(g, tmp_u)
|
||||||
|
|
||||||
def hash2(double_G: Tuple[Tuple[int, int], Tuple[int, int]]) -> int:
|
# return G, g, U
|
||||||
sm3 = Sm3() #pylint: disable=e0602
|
|
||||||
for i in double_G:
|
def hash2(double_G: Tuple[Tuple[int, int], Tuple[int, int]]) -> int:
|
||||||
for j in i:
|
sm3 = Sm3() #pylint: disable=e0602
|
||||||
sm3.update(j.to_bytes(32))
|
for i in double_G:
|
||||||
digest = sm3.digest()
|
for j in i:
|
||||||
digest = int.from_bytes(digest,'big') % sm2p256v1.P
|
sm3.update(j.to_bytes(32))
|
||||||
return digest
|
digest = sm3.digest()
|
||||||
|
digest = int.from_bytes(digest,'big') % sm2p256v1.P
|
||||||
def hash3(triple_G: Tuple[Tuple[int, int],
|
return digest
|
||||||
Tuple[int, int],
|
|
||||||
Tuple[int, int]]) -> int:
|
def hash3(triple_G: Tuple[Tuple[int, int],
|
||||||
sm3 = Sm3() #pylint: disable=e0602
|
Tuple[int, int],
|
||||||
for i in triple_G:
|
Tuple[int, int]]) -> int:
|
||||||
for j in i:
|
sm3 = Sm3() #pylint: disable=e0602
|
||||||
sm3.update(j.to_bytes(32))
|
for i in triple_G:
|
||||||
digest = sm3.digest()
|
for j in i:
|
||||||
digest = int.from_bytes(digest, 'big') % sm2p256v1.P
|
sm3.update(j.to_bytes(32))
|
||||||
return digest
|
digest = sm3.digest()
|
||||||
|
digest = int.from_bytes(digest, 'big') % sm2p256v1.P
|
||||||
def hash4(triple_G: Tuple[Tuple[int, int],
|
return digest
|
||||||
Tuple[int, int],
|
|
||||||
Tuple[int, int]],
|
def hash4(triple_G: Tuple[Tuple[int, int],
|
||||||
Zp: int) -> int:
|
Tuple[int, int],
|
||||||
sm3 = Sm3() #pylint: disable=e0602
|
Tuple[int, int]],
|
||||||
for i in triple_G:
|
Zp: int) -> int:
|
||||||
for j in i:
|
sm3 = Sm3() #pylint: disable=e0602
|
||||||
sm3.update(j.to_bytes(32))
|
for i in triple_G:
|
||||||
sm3.update(Zp.to_bytes(32))
|
for j in i:
|
||||||
digest = sm3.digest()
|
sm3.update(j.to_bytes(32))
|
||||||
digest = int.from_bytes(digest, 'big') % sm2p256v1.P
|
sm3.update(Zp.to_bytes(32))
|
||||||
return digest
|
digest = sm3.digest()
|
||||||
|
digest = int.from_bytes(digest, 'big') % sm2p256v1.P
|
||||||
def KDF(G: Tuple[int, int]) -> int:
|
return digest
|
||||||
sm3 = Sm3() #pylint: disable=e0602
|
|
||||||
for i in G:
|
def KDF(G: Tuple[int, int]) -> int:
|
||||||
sm3.update(i.to_bytes(32))
|
sm3 = Sm3() #pylint: disable=e0602
|
||||||
digest = sm3.digest(32)
|
for i in G:
|
||||||
digest = digest
|
sm3.update(i.to_bytes(32))
|
||||||
digest = int.from_bytes(digest, 'big') % sm2p256v1.P
|
digest = sm3.digest(32)
|
||||||
return digest
|
digest = digest
|
||||||
|
digest = int.from_bytes(digest, 'big') % sm2p256v1.P
|
||||||
|
return digest
|
||||||
return G, g, U, hash2, hash3, hash4, KDF
|
|
||||||
|
|
||||||
def GenerateKeyPair(
|
def GenerateKeyPair(
|
||||||
lamda_parma: int,
|
lamda_parma: int,
|
||||||
@ -210,6 +213,10 @@ def GenerateKeyPair(
|
|||||||
|
|
||||||
return public_key, secret_key
|
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[
|
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]:
|
||||||
enca = Encapsulate(pk)
|
enca = Encapsulate(pk)
|
||||||
@ -273,16 +280,6 @@ def f(x: int, f_modulus: list, T: int) -> int:
|
|||||||
res += f_modulus[i] * pow(x, i)
|
res += f_modulus[i] * pow(x, i)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
# 生成A和B的公钥和私钥
|
|
||||||
pk_A, sk_A = GenerateKeyPair(0, ())
|
|
||||||
pk_B, sk_B = GenerateKeyPair(0, ())
|
|
||||||
|
|
||||||
# sec需要重新设置
|
|
||||||
sec = 256
|
|
||||||
|
|
||||||
# 调用Setup函数
|
|
||||||
G, g, U, hash2, hash3, hash4, KDF = Setup(sec)
|
|
||||||
|
|
||||||
def GenerateReKey(sk_A, pk_B, N: int, T: int) -> list:
|
def GenerateReKey(sk_A, pk_B, N: int, T: int) -> list:
|
||||||
'''
|
'''
|
||||||
param:
|
param:
|
||||||
@ -347,7 +344,6 @@ def Checkcapsule(capsule:Tuple[Tuple[int,int],Tuple[int,int],int]) -> bool: #
|
|||||||
|
|
||||||
return flag
|
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]] :
|
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
|
id,rk,Xa,U1 = kFrag
|
||||||
E,V,s = capsule
|
E,V,s = capsule
|
||||||
|
Loading…
x
Reference in New Issue
Block a user