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

0x01 概述

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

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

0x02 RSA盲签名方案

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

  • Alice选择一个随机数k作为盲化因子
  • Alice对原始的消息进行计算,m' = m k^e (mod \ n) 并把计算后(盲化)的消息 m'发送给Bob
  • Bob计算 s' = (m')^d (mod \ n) 并把计算后的签名值 s' 发送给Alice
  • Alice计算 s = s'k^{-1} (mod \ n)s 就是Bob对原始消息 m的数字签名

证明:

(m')^d \equiv (m k^e)^d \equiv m^d k \ (mod \ n)

(m')^d k^{-1} = (m k^e)^d k^{-1} = m^d k^{e d} k^{-1} = m^d k k^{-1} \equiv m^d

0x03 C语言实现

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

//首先使用盲化银子blind_factor对原始的消息m进行盲化,生成盲化消息blind_message
int blindsignature_hide_message(mbedtls_mpi* m, mbedtls_mpi* blind_factor, mbedtls_mpi* e, mbedtls_mpi* n, mbedtls_mpi* blind_message)
{
    int ret;
    mbedtls_mpi r;
    mbedtls_mpi_init(&r);

    // r = blind_factor ^ e mod n
    if ((ret = mbedtls_mpi_exp_mod(&r, blind_factor, e, n, NULL) ) != 0)
    {
        printf("Hide message: mbedtls_mpi_mod_init failed ret=%8X\r\n", ret);
        goto EXIT;
    }
    // m1 = m * r
    if ((ret = mbedtls_mpi_mul_mpi(blind_message, m, &r)) != 0)
    {
        printf("Hide message: mbedtls_mpi_mul_mpi failed ret=%08X\r\n", ret);
        goto EXIT;
    }
    // blind_message = m1 mod n
    if ((ret = mbedtls_mpi_mod_mpi(blind_message, blind_message, n)) != 0)
    {
        printf("Hide message: mbedtls_mpi_mod_mpi failed ret=%08X\r\n", ret);
        goto EXIT;
    }
EXIT:
    mbedtls_mpi_free(&r);
    return 0;
}

//对盲化的消息进行盲签名,过程同普通rsa签名一样
int blindsignature_sign(mbedtls_mpi* blind_message, mbedtls_mpi* d, mbedtls_mpi* n, mbedtls_mpi* s)
{
    int ret;
    mbedtls_mpi r;

    //s = m ^d mod n
    if ((ret = mbedtls_mpi_exp_mod(s, blind_message, d, n, NULL)) != 0)
    {
        printf("Blind signature: mbedtls_mpi_exp_mod failed ret=%08X\r\n", ret);
        goto EXIT;
    }
EXIT:
    return 0;
}

//对签名结果blind_signature,使用blind_factor去盲化,得到签名值signature
int blindsignature_unblind_sign(mbedtls_mpi* blind_signature, mbedtls_mpi* blind_factor, mbedtls_mpi* n, mbedtls_mpi* signature)
{
    int ret;
    mbedtls_mpi inv_blind_factor;

    mbedtls_mpi_init(&inv_blind_factor);

    if ((ret = mbedtls_mpi_inv_mod(&inv_blind_factor, blind_factor, n)) != 0)
    {
        printf("Unblind signature: mbedtls_mpi_inv_mod failed ret=%08X\r\n", ret);
        goto EXIT;
    }

    if ((ret = mbedtls_mpi_mul_mpi(signature, &inv_blind_factor, blind_signature)) != 0)
    {
        printf("Unblind signature: mbedtls_mpi_mul_mpi failed ret=%08X\r\n", ret);
        goto EXIT;
    }

    if ((ret = mbedtls_mpi_mod_mpi(signature, signature, n)) != 0)
    {
        printf("Unblind signature: mbedtls_mpi_mod_mpi failed ret=%08X\r\n", ret);
        goto EXIT;
    }
EXIT:
    mbedtls_mpi_free(&inv_blind_factor);
    return 0;
}

0x04 总结

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容