2024-07-12  2024-07-12    2174 字  5 分钟

盲签名

盲签名(Blind Signature)

盲签名是由Chaum, David提出的一种数字签名方式,其中消息的内容在签名之前对签名者是不可见的(盲化)。经过盲签名得到的签名值可以使用原始的非盲消息使用常规数字签名验证的方式进行公开验证。盲签名可以有效的保护隐私,其中签名者和消息作者不同,在电子投票系统和数字现金系统中会被使用。

盲签名常常被类比成下面的场景:Alice想让Bob在自己的文件上签名,但是不希望Bob看到文件内容,于是Alice在文件上方叠放了一张复写纸,然后将文件和复写纸放入信封密封起来交给Bob。Bob再拿到信封后验证了Alice的身份后,直接在密封好的信封上签字,这样虽然Bob是对密封后的信封签字,但是Alice拿到签名后的信封后,拆开信封就可以拿到经过Bob签字的文件。

一、盲签名的概念

1.1 盲签名的简介

盲签名是由Chaum, David提出的一种数字签名方式,其中消息的内容在签名之前对签名者是不可见的(盲化)。经过盲签名得到的签名值可以使用原始的非盲消息使用常规数字签名验证的方式进行公开验证。盲签名可以有效的保护隐私,其中签名者和消息作者不同,在电子投票系统和数字现金系统中会被使用。他需要满足以下两个性质:

  • 签名者对其所签署的消息是不可见的,即签名者不知道他所签署消息的具体内容。
  • 签名消息不可追踪,即当签名消息被公布后,签名者无法知道这是他哪次的签署的。

1.2 盲签名的一般过程

  1. 接收者首先将待签数据进行盲变换,把变换后的盲数据发给签名者。
  2. 经签名者签名后再发给接收者。
  3. 接收者对签名再作去盲变换,得出的便是签名者对原数据的盲签名。

图示如下:

     +-----------------+                    +-----------------+
     |   接收者Alice    |                    |    签名者Bob     |
     +-----------------+                    +-----------------+
              |                                      |
              | 1. 盲化消息 M -> B(M)                 |
              |------------------------------------->|
              |                                      |
              |                                      |
              |                             2. 对盲消息 B(M) 签名 S(B(M)) 
              |<-------------------------------------|
              |                                      |
              | 3. 去盲化签名 S(B(M)) -> S(M)          |
              |------------------------------------->|
              |                                      |
     +-----------------+                             |
     | 得到原消息M的签名 |                              |
     | S(M) 可公开验证   |                             |
     +-----------------+                    

二、盲签名的实现

2.1 基于RSA的盲签名实现

盲签名是一种消息在签名之前就被盲化处理的数字签名方案,盲签名可以使用很多公钥加密方案来实现。这里介绍一种基于RSA的盲签名方案。假设消息的持有者Alice希望对消息 $ m $ 使用盲签名方案进行签名,Bob是签名私钥的控制者,他们两方应该执行以下步骤:

  1. Alice选择一个随机数 $ k $ 作为盲化因子计算盲化消息 $ m’ = m k^e \pmod{n} $ 并发送给 Bob
  2. Bob计算 $ s’ = (m’)^d \pmod{n} $ 并把计算后的签名值 $ s’ $ 发送给 Alice
  3. Alice计算 $ s = s’ k^{-1} \pmod{n} $,$ s $ 就是Bob对原始消息 $ m $ 的 RSA 签名。

简单证明如下: $ (m’)^d k^{-1} = (m k^e)^d k^{-1} = m^d k^{ed} k^{-1} = m^d k k^{-1} \equiv m^d $

上述盲签名的交互过程如下图所示:

     +-----------------+                    +-----------------+
     |     Alice       |                    |      Bob        |
     +-----------------+                    +-----------------+
              |                                      |
              | 1. 盲化消息: m' = m · k^e mod n       |
              |------------------------------------->|
              |                                      |
              |                             2. 计算盲签名: s' = (m')^d mod n
              |<-------------------------------------|
              |                                      |
              | 3. 去盲恢复签名: s = s' · k^(-1) mod n|
              |                                      |
     +-----------------+                             |
     | 得到原消息m的签名 |                              |
     | s 可公开验证      |                             |
     +-----------------+                             |

2.2 基于 Schnorr 的盲签名实现

Schnorr 签名是一种常用的数字签名算法,这里介绍一种基于 Schnorr 的盲签名方案。假设消息持有者 Alice 希望对消息 $m$ 使用盲签名方案进行签名,Bob 是签名私钥的持有者,则:

  1. Bob 选择 $k_b \in \mathbb{Z}_q^*$ 并计算 $R = k_b \cdot G$,将 $(R, X)$ 发送给 Alice;$X = x \cdot G$ 是 Bob 公钥。
  2. Alice 选择盲化因子 $a, b, t \in \mathbb{Z}_q^*$,并进行盲化处理如下,并把 $c’$ 发送给 Bob。
    盲化临时公钥:$R’ = R + a \cdot G + b \cdot X$, $\quad \quad \quad \quad$ 盲化公钥:$X’ = X + t \cdot G$
    计算挑战值:$c = H(X’ | R’ | m)$, $\quad \quad \quad \quad \quad \quad \quad \ \ $ 生成盲化挑战:$c’ = c + b$
  3. Bob 用自己的私钥 $x$ 和临时私钥 $k_b$ 计算 $s = k_b + c’ \cdot x \pmod{q}$,并将 $s$ 发送给 Alice。
  4. Alice 用盲化因子计算最终签名 $s’ = s + a + c \cdot t \pmod{q}$,得到的盲签名为 $(R’, s’)$。
  5. 任何人都可以通过公式 $s’ \cdot G = R’ + c \cdot X’$ 验证签名有效性,其中 $c = H(X’ | R’ | m)$。

上述盲签名的交互过程如下图所示:

     +-----------------+                    +-----------------+
     |     Alice       |                    |      Bob        |
     +-----------------+                    +-----------------+
              |                                      |
              |                             1. 选择 k_b ∈ Z_q*, R = k_b·G
              |                             发送 (R, X) 给 Alice
              |<-------------------------------------|
              |                                      |
              | 2. 盲化:                             |
              |    R' = R + a·G + b·X                |
              |    X' = X + t·G                      |
              |    c  = H(X' || R' || m)             |
              |    c' = c + b                        |
              |------------------------------------->|
              |                                      |
              |                             3. s = k_b + c'·x mod q
              |                             返回 s
              |<-------------------------------------|
              |                                      |
              | 4. 去盲: s' = s + a + c·t mod q       |
              |                                      |
     +---------------------------+                    |
     | 得到盲签名 (R', s')        |                    |
     | 通过 s'·G = R' + c·X' 验证 |                   |
     +---------------------------+                   |

上面给出的是椭圆曲线的版本,大整数版本的Schnoor盲签名如下图所示,这里不再赘述。

2.3 基于 BLS 的盲签名实现

我们接着介绍一种基于 BLS 的盲签名方案。假设消息持有者 Alice 希望对消息 $m$ 使用盲签名方案进行签名,Bob 是签名私钥的持有者,他们两方可以执行以下步骤:

  1. Alice 计算消息哈希 $h = H(m)$,其中 $H$ 是将消息映射到群 $G_1$ 的哈希函数。
  2. Alice 选择随机盲化因子 $r \in \mathbb{Z}_p^*$,计算盲化后的哈希 $\bar{h} = h \cdot g^{r}$ 并将 $\bar{h}$ 发送给 Bob。
  3. Bob 用自己的私钥 $x$ 计算盲化签名 $\bar{s} = \bar{h}^x$,并将 $\bar{s}$ 发送给 Alice。
  4. Alice 使用盲化因子 $r$ 和 Bob 的公钥 $y = g^x$ 计算最终签名 $s = \bar{s} \cdot y^{-r}$ 得到 Bob 对原始消息 $m$ 的有效 BLS 签名 $s$。
  5. 任何人都可以通过双线性对验证签名:检查是否满足 $e(s, g) = e(h, y)$ 如果相等即可。

上述盲签名的过程可用下图表示:

     +-----------------+                    +-----------------+
     |     Alice       |                    |      Bob        |
     +-----------------+                    +-----------------+
              |                                      |
              | 1. 计算消息哈希 h = H(m)               |
              | 2. 盲化哈希: ȟ = h · g^r              |
              |------------------------------------->|
              |                                      |
              |                             3. 计算盲签名:  ś = ȟ^x
              |<-------------------------------------|
              |                                      |
              | 4. 去盲恢复签名: s = ś · y^(-r)        |
              |------------------------------------->|
              |                                      |
     +-----------------+                             |
     | 得到原消息m的签名  |                             |
     | s 可公开验证      |                             |
     +-----------------+                             |
              |                                      |
              | 5. 验证: 检查 e(s, g) =? e(h, y)      |
              |                                      |