盲簽名算法的原理與C語言實現(xiàn)

0x01 概述

盲簽名(Blind Signature) 是由Chaum,David提出的一種數(shù)字簽名方式蝙眶,其中消息的內(nèi)容在簽名之前對簽名者是不可見的(盲化)。經(jīng)過盲簽名得到的簽名值可以使用原始的非盲消息使用常規(guī)數(shù)字簽名驗證的方式進行公開驗證崩掘。盲簽名可以有效的保護隱私,其中簽名者和消息作者不同粥帚,在電子投票系統(tǒng)和數(shù)字現(xiàn)金系統(tǒng)中會被使用圣贸。

盲簽名常常被類比成下面的場景:Alice想讓Bob在自己的文件上簽名,但是不希望Bob看到文件內(nèi)容于宙,于是Alice在文件上方疊放了一張復寫紙浮驳,然后將文件和復寫紙放入信封密封起來交給Bob。Bob再拿到信封后驗證了Alice的身份后捞魁,直接在密封好的信封上簽字至会,這樣雖然Bob是對密封后的信封簽字,但是Alice拿到簽名后的信封后谱俭,拆開信封就可以拿到經(jīng)過Bob簽字的文件奉件。

0x02 RSA盲簽名方案

盲簽名是一種消息在簽名之前就被盲化處理的數(shù)字簽名方案,盲簽名可以使用很多公鑰加密方案來實現(xiàn)昆著。這里只介紹最簡單的一種實現(xiàn)县貌,基于RSA加密算法的盲簽名方案。假設消息的持有者Alice希望對消息m使用盲簽名方案進行簽名凑懂,Bob是簽名私鑰的控制者煤痕,他們兩方應該執(zhí)行以下步驟:

  • Alice選擇一個隨機數(shù)k作為盲化因子
  • Alice對原始的消息進行計算,m' = m k^e (mod \ n) 并把計算后(盲化)的消息 m'發(fā)送給Bob
  • Bob計算 s' = (m')^d (mod \ n) 并把計算后的簽名值 s' 發(fā)送給Alice
  • Alice計算 s = s'k^{-1} (mod \ n)s 就是Bob對原始消息 m的數(shù)字簽名

證明:

(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語言實現(xiàn)

因為需要使用大數(shù)運算摆碉,可以使用你熟悉的任何語言實現(xiàn)祟敛,也可以用任意成熟的大數(shù)運算庫實現(xiàn)。這里我使用了mbedTLS的大數(shù)運算庫兆解。

//首先使用盲化銀子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;
}

//對簽名結(jié)果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 總結(jié)

RSA盲簽名的代碼历谍、調(diào)用示例程序都已經(jīng)上傳现拒,可以直接檢出測試,沒有仔細測試驗證可能有各種問題望侈,如果遇到問題印蔬,可以給我提issues

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脱衙,一起剝皮案震驚了整個濱河市侥猬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捐韩,老刑警劉巖退唠,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荤胁,居然都是意外死亡瞧预,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門仅政,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垢油,“玉大人,你說我怎么就攤上這事圆丹√渤睿” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵辫封,是天一觀的道長惊楼。 經(jīng)常有香客問我,道長秸讹,這世上最難降的妖魔是什么檀咙? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮璃诀,結(jié)果婚禮上弧可,老公的妹妹穿的比我還像新娘。我一直安慰自己劣欢,他們只是感情好棕诵,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布裁良。 她就那樣靜靜地躺著,像睡著了一般校套。 火紅的嫁衣襯著肌膚如雪价脾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天笛匙,我揣著相機與錄音侨把,去河邊找鬼。 笑死妹孙,一個胖子當著我的面吹牛秋柄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蠢正,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼骇笔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嚣崭?” 一聲冷哼從身側(cè)響起笨触,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雹舀,沒想到半個月后旭旭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡葱跋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年持寄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娱俺。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡稍味,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荠卷,到底是詐尸還是另有隱情模庐,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布油宜,位于F島的核電站掂碱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏慎冤。R本人自食惡果不足惜疼燥,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚁堤。 院中可真熱鬧醉者,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剥槐,卻和暖如春唱歧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粒竖。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工颅崩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人温圆。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像孩革,于是被迫代替她去往敵國和親岁歉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容