1.盲签名
盲签名(blind signature)是在1982年由David Chaum在论文《Blind Signatures for Untraceable Payment》中提出。签名者需要在无法看到原始内容的前提下对信息进行签名。 盲签名可以实现对所签名内容的保 护,防止签名者看到原始内容;另一方面,盲签名还可以实现防止追踪(unlinkability),签名者无法将签名内容和签名结果进行对应。典型的实现包括RSA盲签名算法等。
一般的签名,签名者对自己发出的签名,必须是记得的,比如,在何时何地对谁发的,他自己可以记下来。但是,如果把签名看作是电子现金的话,就涉及到一个匿名性的问题 用实际钞票的时候,钞票上有没有写你的名字?当然没有。那我也不希望,银行通过追踪自己发出签名,来获得用户的消费情况。于是就设计出盲签名。
盲化消息:
签名消息:
除盲消息:
c %v [133 241 63 27 201 104 77 37 140 72 77 12 225 227 117 250 33 176 163 54 118 193 61 200 42 64 26 197 152 39 65 143 33 211 163 126 228 21 65 231 138 121 71 173 68 56 132 82 179 33 244 140 98 220 126 229 18 61 137 169 227 149 228 132 232 107 85 57 144 146 230 15 84 70 78 155 88 178 195 41 181 25 106 67 232 182 83 53 19 17 120 139 220 91 233 193 47 56 76 141 197 76 223 67 94 132 151 117 17 106 217 72 70 235 135 135 12 204 162 162 130 203 209 13 153 20 26 90]
r %v [52 165 182 202 3 86 167 85 97 51 195 75 125 136 42 51 245 214 109 224 139 48 216 59 194 181 22 37 182 205 247 165 208 67 250 228 177 185 198 145 173 187 74 215 168 121 88 200 3 148 152 109 48 6 7 145 17 49 43 242 122 251 121 79 177 237 221 94 96 17 181 10 134 49 236 59 71 209 225 139 196 217 107 24 176 18 221 180 134 213 55 80 31 215 45 62 220 168 51 172 129 64 177 184 248 22 66 224 167 169 51 82 40 207 67 23 68 134 23 209 77 48 145 167 87 109 170 11]
sig [48 231 30 185 82 179 140 84 159 149 47 210 52 80 99 225 116 144 43 242 201 103 196 17 73 177 122 159 17 70 233 24 208 3 179 22 194 149 7 175 248 20 12 99 108 74 194 57 167 234 122 160 19 132 138 168 117 166 87 79 148 253 140 15 155 79 117 60 37 221 198 18 67 171 50 83 172 216 37 71 122 194 234 41 75 231 153 112 17 154 3 86 93 167 253 54 242 163 62 32 29 27 178 10 100 69 170 65 159 246 74 202 76 244 137 31 59 97 132 130 10 1 179 222 98 194 240 111]
r [52 165 182 202 3 86 167 85 97 51 195 75 125 136 42 51 245 214 109 224 139 48 216 59 194 181 22 37 182 205 247 165 208 67 250 228 177 185 198 145 173 187 74 215 168 121 88 200 3 148 152 109 48 6 7 145 17 49 43 242 122 251 121 79 177 237 221 94 96 17 181 10 134 49 236 59 71 209 225 139 196 217 107 24 176 18 221 180 134 213 55 80 31 215 45 62 220 168 51 172 129 64 177 184 248 22 66 224 167 169 51 82 40 207 67 23 68 134 23 209 77 48 145 167 87 109 170 11]
sigorc [14 73 206 139 106 134 76 44 12 74 115 72 159 66 78 200 120 199 1 107 252 52 158 186 231 177 171 11 45 144 44 154 143 229 44 5 169 125 228 39 244 29 101 233 176 165 17 56 25 126 227 190 93 235 31 225 251 95 100 77 58 150 134 32 35 189 178 168 188 36 192 165 55 16 19 0 29 92 254 187 252 172 12 30 118 31 122 233 74 164 177 228 236 198 112 129 211 17 57 168 154 240 222 133 63 211 85 180 127 105 107 94 13 4 111 213 239 113 182 42 141 248 21 97 169 108 158 107]
2.多重签名
多重签名(multiple signature)即n个签名者中,收集到至少m个(n>=m>=1)的签名,即认为合法。其中,n是提供的公钥个数,m是需要匹配公钥的最少的签名个数。 多重签名可以有效地被应用在多人投票共同决策的场景中。例如双方进行协商,第三方作为审核方。三方中任何两方达成一致即可完成协商。 比特币交易中就支持多重签名,可以实现多个人共同管理某个账户的比特币交易。
3.群签名
群签名(group signature)即某个群组内一个成员可以代表群组进行匿名签名。签名可以验证来自于该群组,却无法准确追踪到签名的是哪个成员。 群签名需要存在一个群管理员来添加新的群成员,因此存在群管理员可能追踪到签名成员身份的风险。 群签名最早于1991年由David Chaum和Eugene van Heyst提出。
4.环签名
环签名(ring signature),由Rivest、Shamir和Tauman三位密码学家在2001年首次提出。环签名属于一种简化的群签名。环签名中只有环成员没有管理者,不需要环成员间的合作。 签名者首先选定一个临时的签名者集合,集合中包括签名者自身。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立地产生签名,而无需他人的帮助。
例如,某个用户在线下进行消费,并通过比特币进行支付,那么商家事实上建立了对用户的线上(比特币地址)线下(用户身份)关联。为避免个人隐私信息的泄露,用户必须十分谨慎地对其比特币帐户地址进行管理和隔离。从这个角度来而言,比特币无法满足交易不可追踪和不可关联的条件。 而基于群签名(group signatures)基础上环签名(ring signatures)技术,提供了可行的匿名性解决办法。环签名在保护匿名性方面有很多的用途。
在一个合租公寓里,每个人都拥有一个不同的大门密码(公钥)
,另外各自都有自己的卧室小门钥匙(私钥);第二步:签字确认。
清洁阿姨每周都要来打扫,房东要求每位租客在清洁阿姨每周打扫时接待她,
但租客并不想让房东知道是谁每次给阿姨开门。阿姨要进来时,
只能通过其中一个租客提供一个公钥。阿姨每次进门只能通过某
个租客的公钥开门,但是由于阿姨没有私钥,进不去每个租客的小门,
也不知道自己用了谁的公钥(房东可以根据阿姨是否可以进门得知是租
客给阿姨开的门,即签名确认)。第三步:签名验证。房东可以根据阿姨
可以进门和是否打扫过得知是租客给阿姨开的门,但不知道是哪位租客。
环签名不需要管理者,由于其无条件匿名性和不可伪造性的特点,
使得其在隐秘性方面比一般的群签名更加突出。
过程
1、密钥生成。为环中每个成员产生一个密钥对(公钥PKi,私钥SKi)。
2、签名。签名者用自己的私钥和任意n个环成员(包括自己)的公钥为消息m生成签名a。
3、签名验证。验证者根据环签名。和消息m,验证签名是否为环中成员所签,如果有效就接收,否则丢弃。
GetPublickey &{[0xc000058c00]}
GetPublickey &{[0xc000058c00 0xc000058ce0]}
GetPublickey &{[0xc000058c00 0xc000058ce0 0xc000058da0]}
GetPublickey &{[0xc000058c00 0xc000058ce0 0xc000058da0 0xc000058e60]}
GetPublickey &{[0xc000058c00 0xc000058ce0 0xc000058da0 0xc000058e60 0xc000058f20]}
GetPublickey &{[0xc000058c00 0xc000058ce0 0xc000058da0 0xc000058e60 0xc000058f20 0xc000058fe0]}
GetPublickey &{[0xc000058c00 0xc000058ce0 0xc000058da0 0xc000058e60 0xc000058f20 0xc000058fe0 0xc0000590a0]}
GetPublickey &{[0xc000058c00 0xc000058ce0 0xc000058da0 0xc000058e60 0xc000058f20 0xc000058fe0 0xc0000590a0 0xc000059160]}
GetPublickey &{[0xc000058c00 0xc000058ce0 0xc000058da0 0xc000058e60 0xc000058f20 0xc000058fe0 0xc0000590a0 0xc000059160 0xc000059220]}
msg.success [223 10 79 250 99 163 232 38 55 55 83 165 163 210 26 176 153 137 99 209 8 129 112 36 149 84 214 131 94 112 212 56 209 213 191 92 85 151 181 64 5 248 131 37 224 204 202 108 69 4 193 123 218 96 14 75 238 115 223 129 7 37 17 12 228 221 107 184 150 71 239 2 97 209 19 51 83 174 12 68 141 24 170 215 92 237 234 213 21 53 95 225 106 223 85 56 227 169 132 9]
sig.success ringsign:
X=69503597821965800623341671777827857704468245440459762721641660776990290913851
Y=75712897085611261239522751994792067485927189561029721615921068584738220303795
C[0]: 112578249228524954352835474689151749504297561350088136810055837732475662055098
T[0]: 48248968515715506936179616603575119582058408724731394955121557586875288587070
C[1]: 62509721196085006667283998254936280156250995052173555588093618808533354598805
T[1]: 83342758629393280076158798759009077439180780647662247222423928186750306871978
C[2]: 19555009242512795120374769508467099964945209260631335431330185826382806972435
T[2]: 6402844495017625280233987078055226541338191648939702531288273994453435402999
C[3]: 10906967504749123294584871013742782865426849093817942906732674179930396631739
T[3]: 35221145441865968410859688033094020361745973297904650759675047801671683689242
C[4]: 55934543781945360219042161659959731970402886210092695405087961505238117878600
T[4]: 7924636733180404541283460270281815218782499272863545514416385703218189469733
C[5]: 79851871518650802149809410385240544049937769216519191500162761211595745373882
T[5]: 23977737405131056114997898848466151693361526130435422349597853784022513145475
C[6]: 58677418157677465546771206662958187329057966087316300913517644602317035606642
T[6]: 27735065873259339081829230944673327927599219142233902395184838238366245836129
C[7]: 59700230870596096046277932011055840150529279703754817632730833467356497640359
T[7]: 45986933587796177164576772144777527895822075126321654348463971933518402637653
C[8]: 73815676967464652266639812326118028832188526196489214570322781615365201151984
T[8]: 23001072736277333365578742573818674650925661645095339005940506095166950512935
C[9]: 100346252941065059740974872241986519309617752255863358213860477291244290629039
T[9]: 30441978113692846884554296155316302717233963586567088616543883457466979370181
零知识证明。---------汽车KEY
A给出一个随机值,并使用B的公钥对其加密,然后将加密后的数据交给B,
B用自己的私钥解密并展示给A,如果与A给出的随机值相同,则证明对方是B。