施诺尔识别方案
Schnorr 签名以其简单性而闻名,并且是第一个其安全性基于某些离散对数问题的难处理性的签名之一。 Schnorr 数字签名方案不同于识别方案。私钥持有者使用身份识别方案向您证明他们持有私钥。此外,签名方案还证明密钥持有者将其私钥与特定消息一起用作输入值,以便在该特定消息上生成可验证的数字签名。
具有离散对数的Schnorr识别方案
等价 '≡' 的含义
整数模(通常缩写为“mod”)36 的元素是 0、1、... . . , 34, 35。那么 41 等价于 5 模 36,写作 41 ≡ 5 mod 36,因为当 41 除以 36 时,余数是 5。
同样,我们也有 57 ≡ 5 mod 26。
离散对数:
离散对数是关于乘法循环群定义的对数。如果 G 是乘法循环群,g 是 G 的生成元,那么根据循环群的定义,我们知道 G 中的每个元素 h 对于某个 x 都可以写成 g x 。组 G 中 h 的以 g 为底的离散对数定义为 x 。
如果组是 A,生成器是 2,那么 1 的离散对数是 4,因为 24 ≡ 1 mod 5。
对数 log b (a) 是一个数 x,对于给定的数 a 和 b,b x = a。类似地,在任何组 G 中,可以为所有整数 k 定义幂 b k ,并且离散对数 log b (a) 是整数 k,使得 b k = a。
我们有以下3个参数:
- g 是生成器,
- x 是秘密值
- p 是质数。
算法
证明者 Sanchita 具有 (g, X) 的证明公钥,其中 g 是生成器,并且 X=gx(modN)。在 Sanchita 生成她的公开证明密钥后,Sachin 将挑战她以产生正确的结果。离散对数是满足方程 ax≡b(modm) 的整数 x,其中 a 和 m 互质。
通过 Schnorr 识别,Sanchita(证明者)有一个证明公钥(N,g,X)和一个证明秘密密钥(N,x)。 N 是模运算的素数,x 是秘密,其中:
X←gx(modN)
在注册秘密时,Sanchita 生成一个随机值 (y),然后计算 Y:
Y←gy(modN)
这个值被发送给 Sachin(他是验证者)。 Sachin 然后生成一个随机值 (c) 并将其发送给 Sanchita。这是对 Sanchita 产生正确结果的挑战。 Sanchita 然后计算:
z←(y+xc)(modN)
然后,他将其发送给 Sachin,以证明他知道 x。然后 Sachin 计算两个值:
val1 = YXc(modN)
val2 = gz(modN)
如果值相同(val1≡val2),Sanchita 已经证明她知道 x。
这有效,因为:
YXc = gygxc = gy+cx
gz = gy+cx
Python3
import random
import sys
PRIMENO = 89
generator = 3
secretVal = random.randint(1, 97)
X = pow(generator, secretVal) % PRIMENO
y = random.randint(1, 97)
Y = pow(generator, y) % PRIMENO
print("Sanchita (the Prover) generates these values:")
print("secretVal(secret)= ", secretVal)
print("PRIMENO= ", PRIMENO)
print("X= ", X)
print("\nSanchita generates a random value (y):")
print("y=", y)
print("\nSanchita computes Y = generator^y \
(mod PRIMENO) and passes to Sachin:")
print("Y=", Y)
print("\nSachin generates a random value (c) and\
passes to Sanchita:")
c = random.randint(1, 97)
print("c=", c)
print("\nSanchita calculates z = y.secretVal^c \
(mod PRIMENO) and send to Sachin (the Verifier):")
z = (y + c * secretVal)
print("z=", z)
print("\nSachin now computes val=generator^z (mod PRIMENO)\
and (Y X^c (mod PRIMENO)) and determines if they are the same\primeNo")
val1 = pow(generator, z) % PRIMENO
val2 = (Y * (X**c)) % PRIMENO
print("val1= ", val1, end=' ')
print(" val2= ", val2)
if (val1 == val2):
print("Sanchita has proven that she knows x")
else:
print("Failure to prove")
输出:
应用:
- 它在密码学研究中有它的用例
- 它用于实现零知识证明。
- 它提供了一种更安全的身份验证方式,无需证明者透露其密钥。