盲签名算法的原理与C语言实现

本文原始链接https://blog.csdn.net/youngbug/article/details/125302865

由先驱詹天佐说明: https://profile-avatar.csdnimg.cn/08d398956428496fa96bf1e00b968bec_youngbug.jpg!1原创

0x01 概述

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

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

0x02 RSA盲签名方案

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

·         Alice选择一个随机数k 作为盲化因子

·         Alice对原始的消息进行计算, 并把计算后(盲化)的消息 m ′ 发送给Bob

·         Bob计算 并把计算后的签名值 s ′ 发送给Alice

·         Alice计算 s 就是Bob对原始消息 m的数字签名

0x03 Snooper脚本实现

因为需要使用大数运算,可以使用你熟悉的任何语言实现,也可以用任意成熟的大数运算库实现。这里我使用了Snooper脚本进行计算。

e       = 03

x       = new_rsa_genstd( 0100, $e )

n       = mid( $x, 0, 32 )

d       = mid( $x, 32, 32 )

 

m       = dup( 32, 1f )

 

 

// Alice选择一个随机数k 作为盲化因子

 

k       = random( 32 )

 

// Alice对原始的消息进行计算, m' = m k^e (mod n)并把计算后(盲化)的消息 m' 发送给Bob

tmp     = big_mod_exp( $k, $e, $n )

mp      = big_mod_mul( $m, $tmp, $n )

 

// Bob计算 s' = (m')^d (mod  n)并把计算后的签名值 s'  发送给Alice

sp      = big_mod_exp( $mp, $d, $n )

 

// Alice计算 s = s'k^{-1} (mod  n), s 就是Bob对原始消息 m 的数字签名

k1      = big_mod_inv( $k, $n )

tmp     = big_mod_mul( $k, $k1, $n )

 

s       = big_mod_mul( $sp, $k1, $n )

 

ori_msg = big_mod_exp( $m, $d, $n )

 

if $s != $ori_msg

    ?

    pause

endif

 

0x04 总结

RSA盲签名的代码、调用示例程序都已经上传,可以直接检出测试,没有仔细测试验证可能有各种问题,如果遇到问题,可以给我提issues

git clone https://github.com/youngbug/blindsignatures_rsa.git
·         1

https://youngbug.github.io/cryptography/2022/06/15/Blind-Signature.html