盲签名

随着互联网的普及,为在线支付营造了丰沃的土壤,支付宝、微信支付与各大银行App纷纷登上在线支付的头把交椅。有的人甚至说“只需要一部手机就可以走遍天下”。但是,在线支付虽然便捷且交易的是一串数字但并不是电子现金,在线支付并不具备匿名性,容易追踪到某笔交易金额的来源和购买的商品,而电子现金具备匿名性,无法追踪电子现金来源。其中技术用到了假名、零知识证明、环签名、盲签名等等。

电子现金

电子现金(Electronic Cash)其实是一种用电子形式模拟现金的技术。电子现金系统企图在多方面为在线交易复制现金的特性:方便、费用低(或者没有交易费用)。不记名以及其他性质。但不是所有的电子现金系统都满足这些特点,多数电子现金系统都能为小额在线交易提供快捷与方便。

电子现金优于真实现金之处在于它安全、超距、迅速、低成本、匿名性、精确性等,这大大强化了现金的可移动性。电子现金通过信息网络系统和公共信息平台实现流通、存取、支付。在电子现金的支付中有三方参与:银行、用户、商家

电子现金在线交易一般需要以下三个基本阶段:

**取款阶段:**用户从自己的银行账户上提取数字现金

**支付阶段:**用户使用数字现金从商店中购买商品

**存款阶段:**用户及商家将数字现金存入到自己的银行账户上

在电子现金支付和使用的过程中,为了保护用户购买商品、服务时的隐私,接收方不应获得支付方的任何身份信息。

盲签名可以实现银行向合法用户发放有效的电子现金,使用户可以使用有效的电子现金进行交易,银行本身也无法通过电子现金追踪到该电子现金是属于哪个用户的。

盲签名的概念

盲签名的概念首先由 David Chaum 于1982年提出,盲签名实现了签名者对发送者的消息进行签名,却不能知道签名者消息的具体内容。

相当于将文件放入信封,签名者在信封上对文件进行签名,而不知道具体的文件内容。

性质

  1. 不可伪造性,除了签名者本人外,任何人不能以他的名义生成有效的盲签名
  2. 不可抵赖性,签名者一旦签署了某个消息,他无法否认自己对消息的签名
  3. 盲性,签名者虽然对某个消息进行了签名,但他不可能得到消息的具体内容。
  4. 不可跟踪性,一旦消息的签名公开后,签名者不能确定自己何时签署的这条消息。

模型

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

img

基于RSA的盲签名

假设A是接收者,B是签名者,私钥dd,公开RSA公钥(n,e)(n,e),A让B盲签名消息mm

  1. 选取盲引子rr,计算m=mre mod nm^{\prime}=m*r^e\ mod\ n

  2. B对mm^{\prime}进行签名md=(mre)d mod nm^{\prime d}=(m*r^e)^d\ mod\ n

  3. A去盲得到原始签名 s=mdr1=(mre)dr1 mod n=mdredr1 mod n=md mod ns=m^{\prime d} * r^{-1}=(m*r^e)^d*r^{-1}\ mod\ n=m^d*r^{ed}*r^{-1}\ mod\ n=m^d\ mod\ n

正确性容易证明

java测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.math.BigInteger;
/**
* 盲签名相关
* Created by forest on 2017/5/23.
*/
public class blindSignature {
public static void main(String[] args){
System.out.println("这里是盲签名测试");

BigInteger e = new BigInteger("32663");
BigInteger d = new BigInteger("23");
BigInteger n = new BigInteger("42167");

BigInteger m = new BigInteger("123"); //签名的消息
BigInteger factor = new BigInteger("37"); //盲因子

BigInteger blindMsg = blindHideMsg(m, factor, e, n);
BigInteger blindSig = blindSignature(blindMsg, d, n);
BigInteger sig = blindRetriveSig(blindSig, factor, n);
System.out.println("盲签名 = " + sig);
BigInteger realSig = m.modPow(d, n);
System.out.println("原签名 = " + realSig);
}

/**盲签名-盲化*/
public static BigInteger blindHideMsg(BigInteger msg, BigInteger factor, BigInteger e, BigInteger n){
BigInteger hideMsg = msg.multiply(factor.modPow(e, n)).mod(n);
return hideMsg;
}

/**盲签名-签名*/
public static BigInteger blindSignature(BigInteger blindMsg, BigInteger d, BigInteger n){
BigInteger blindSig = blindMsg.modPow(d, n);
return blindSig;
}

/**盲签名-解盲得到签名*/
public static BigInteger blindRetriveSig(BigInteger blindSig, BigInteger factor, BigInteger n){
BigInteger signature = blindSig.multiply(factor.modInverse(n)).mod(n);
return signature;
}

盲签名在区块链中的应用

区块链系统中地址是由用户自行生成,与用户的身份信息无关,用户创建和使用地址不需要第三方参与。因此,区块链地址具有较好的匿名性。

但是区块链交易之间的关联性可以被用于推测敏感信息。区块链所有数据都存储在公开的全局账本中,通过分析这些交易之间的关联关系(比如:同一交易的所有输入地址属于同一用户集合、找零地址和输入地址属于同一用户等等),再结合一些背景知识,能够逐步降低区块链地址的匿名性,甚至发现匿名地址对应用户的真实身份。

因此,在区块链网络中,为了保护隐私信息,出现了一些隐私保护机制,其中Blindcoin协议是其中一种中心化混币技术,是一个基于盲签名技术的隐藏机制。

image-20230726193222630

如上图所示,Blindcoin协议是在Mixcoin 协议基础上,通过盲签名技术,使得混币用户的输入输出地址映射关系对混币服务商M不可见。