网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

RSA盲签名是什么?

更新时间:2026年03月27日   作者:spoto   标签(Tag):

盲签名是一种数字签名方式,其特点是在消息被任何相关方签署之前,消息的内容会被隐藏起来。这种技术使得发送消息的人无法被识别。这种签名方式主要用于当发送者和签名者属于不同主体的情况。盲签名可以通过多种常见的公钥签名算法来实现,例如DSA和RSA等算法。

在RSA盲签名中,RSA指的是Rivest-Shamir-Adleman算法。这是一种用于安全数据传输的公钥加密系统。RSA是最常用的加密系统之一,其原理基于大整数分解的难度。

RSA盲签名技术最初是由Chaum在数字现金系统的背景下提出的,其目的是为了实现不可追踪的支付。

盲签名协议

RSA盲签名协议是一种由客户端和服务器之间进行的双方通信协议。双方通过交互来计算出签名值sig=Sign(sk, input_msg)。其中,input_msg = Prepare(msg),这里的input_msg实际上是客户端发送的私有消息的预处理版本。而sk则是由服务器提供的私有签名密钥。

该协议包含五个功能。

  1. 准备
  2. 失明
  3. BlindSign
  4. 完成/结束
  5. 验证/确认

此外,还需要客户端与服务器之间进行一轮交互。

该协议的假设条件:

设 msg 为客户端私有的输入消息,而 (sk, pk) 则代表服务器既属于私有信息又属于公开信息的组合。

该协议从客户端开始,客户端需要准备要被签名的信息。

input_msg = Prepare(msg)

然后,客户端通过执行以下操作来启动盲签名协议:

blinded_msg, inv = Blind(pk, input_msg)

然后,客户端将 blinded_msg 发送给服务器。服务器会处理这条消息,具体操作包括:

blind_sig = BlindSign(sk, blinded_msg)

然后,服务器将 blind_sig 发送给客户端。客户端随后通过计算来完成协议的最后处理步骤。

sig = 最终处理过的数据(pk, input_msg, blind_sig, inv)

协议中使用的函数/功能

准备吧。

这是一种用于将需要签名和验证的信息进行准备的流程。在这个过程中,有两种类型的准备工作:第一种是身份确认相关的准备工作,第二种则是随机化处理相关的准备工作。
该身份准备函数会返回未经任何转换的原始输入消息,即 msg = PrepareIdentity(msg)。
随机化函数的参数,指的是将新生成的随机数据作为输入信息。该函数的表示为PreapareRandomize(msg)。该函数接收一个消息作为输入,然后返回一个经过随机化处理后的输入消息作为输出。

2. 实施/执行

输入内容:
msg:需要签署的消息,是一个字节字符串。
输出结果:
输入的消息是一个字节字符串,其长度比“msg”多出32个字节。
步骤:–
msg_prefix = 随机生成的32位或64位数值
2. input_msg = concat(msg_prefix, msg)
3. 输出输入的消息

  1. 失明:该函数会对输入的消息进行加密处理,同时使用服务器的公钥对消息进行“盲加密”。最终,它会输出经过盲加密后的消息,该消息以字节串的形式呈现,同时还会附带与之对应的逆运算结果,即一个整数。
    假设该函数在执行过程中出现任何错误时都会失败,那么实现中应该尝试再次调用该函数。该函数会初始化RSAVP1,而RSAVP1被定义为会抛出一个表示输入无效的异常。
    盲编码(pk, msg)
    参数:
    modulus_len,即RDA模数n的字节长度。
    2. “Hash”这个功能用于将消息进行哈希处理。
    3. MGF,掩模生成函数
    4. salt_len,即盐的字节长度(在RFC 8017中表示为sLen)。
    输入内容:
    PK,服务器公钥(n,e)
    2. msg:需要签署的消息,是一个字节字符串。
    输出结果:
    blinded_msg,一个长度为modulus_len的字节字符串。
    2. inv,一个整数,用于解除对“Finalize”过程中签名的保护。

encoded_msg = EMSA-PSS-ENCODE(msg, bit_len(n)),其中Hash、MGF和salt_len的含义如参数中所定义。

2. 如果EMSAA-PSS-ENCODE出现错误,请重新报告该错误,并停止操作。

3. m = bytes_to_int(encoded_msg)

4. c = is_coprime(m, n)

5. 如果c为假命题,则引发“输入无效”的错误,并停止操作。

6. r = random_integer_uniform(1, n)

7. inv = inverse_mod(r, n)

8. 如果 inverse_mod 操作失败,则应抛出一个“严重错误”的异常,并停止该操作。

9. x = RSAVP1(pk, r)

10. z = (m * x) % n

11. blinded_msg = int_to_bytes(z, modulus_len)

12. 输出 blinded_msg,inv

3. 盲目标志

BlindedSign 会对客户端输入的被屏蔽的消息进行 RSA私钥的运算处理,然后将计算结果以字节字符串的形式返回。
BlindSign(sk, blinded_msg)
参数:
modulus_len,即RSA模数n的字节长度。
输入内容:
sk,即服务器的私钥。
2. blinded_msg:经过编码和加密后的消息,需要被签名。它实际上是一个字节字符串。
输出结果:
blind_msg:经过加密且被屏蔽的、需要签署的消息,表示为一个字节字符串。

步骤:

m = bytes_to_int(blinded_msg)

2. s = RSASP1(sk, m)

3. m’ = RSAVP1(pk, s)

4. 如果 m!= m’,则抛出“签名失败”的错误,并停止处理。

5. blind_sig = int_to_bytes(s, modulus_len)

6. 输出 blind_sig

4. 完成/结束

该验证过程用于确认服务器的响应是否正确,同时解密消息以生成签名。之后,会再次验证签名的准确性,如果一切正常的话,就会输出该签名。参数:
modulus_len,即RSA模数n的字节长度。
参数:

  1. 哈希函数,用于对消息进行哈希处理的函数。
  2. MGF,即掩模生成函数。
  3. salt_len,即盐的字节长度(在RFC 8017中表示为sLen)。

输入内容:

  1. PK:服务器公共密钥(n, e)
  2. msg:需要签署的消息,是一个字节字符串。
  3. blind_sig,即经过签名处理且已被盲编码后的元素,它实际上是一个字节字符串。
  4. 长度模量:len
  5. inv,即“盲数”的倒数,是一个整数。

输出结果:

sig,一个长度为modulus_len的字节字符串。

步骤:

如果 len(blind_sig)!= modulus_len,那么应抛出一个“意外输入大小”的异常。

出错并停止

2. z = bytes_to_int(blind_sig)

3. s = (z * inv) % n

4. sig = int_to_bytes(s, modulus_len)

5. result = RSASSA-PSS-VERIFY(pk, msg, sig)

如参数中所定义的那样,包括 Hash、MGF 以及 salt_len。

6. 如果 result 的值为 “valid signature”,则输出 sig;否则,抛出 “invalid signature” 错误并停止处理。

5. 验证/确认

该协议的输出结果包括消息输入_msg以及签名sig。输入的消息会被存储在msg中,而输入_msg则是从该消息中派生出来的。
最后,客户端使用服务器的公钥pk来验证消息的签名,具体操作是通过调用RSASSA-PSS-VERIFY函数来实现的。

              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料