# Variations of Digital Signature > 資料來源:NCKU 李南逸教授之**密碼學**課程-密碼學應用 3。 ## Increase Efficiency ### On-line/Off-line Signature Scheme based on RSA > 優點:速度快、效率佳; 缺點:**One-time**。 在線/離線簽名在需要快速生成簽名的環境中非常有用,無論是由於大量請求,還是因為執行簽名的設備計算能力不足。 #### Off-Line Computation 離線計算包括一次性密鑰方案的密鑰生成階段,其中包括生成密鑰對 $vk$ 和 $sk$ 並使用 RSA 簽署 $vk$。 因此,為了 bit-length 為 $n$ 的訊息進行簽名,簽名者首先執行以下步驟: 1. 選擇 $t = n + \lfloor{\log n}\rfloor + 1$ 個位長為 $l$ 的隨機秘密字串 $k_1, k_2, \dots, k_t$。 2. 計算 $u_i = H(k_i)$,其中 $1 \leq i \leq t$,並且 $H: \{0,1\}^* \to \{0,1\}^m$ 是一個 pre-image-resistant 的雜湊函數。 接著,$vk = (v_1, v_2, \dots, v_t)$ 和 $sk = (k_1, k_2, \dots, k_t)$。 現在,簽名者使用 RSA 簽名密鑰 $SK$ 簽署 $vk$,獲得 $\Sigma = H(vk)^S \mod N$,並且簽名者存儲 $vk$、$sk$ 和 $\Sigma$。 #### On-line Signing 為了對訊息 $m \in \{0,1\}^n$ 進行簽名,簽名者檢索已存儲的、預先計算的、未使用的三元組 $(vk, sk, \Sigma)$,並使用 $sk$ 來計算訊息 $m$ 的 one-time signature,具體步驟如下: 1. 計算 $c$,即訊息 $m$ 中 0 的數量的二進位表示。 2. 形成 bit-string $w = m \parallel c = (a_1, a_2, \dots, a_t)$。 3. 找出 $w$ 中 1 的位置 $i_1 < i_2 < \dots < i_u$,其中 $a_{i_j} = 1$,且 $1 \leq j \leq u$。 4. 設置 $s_j = k_{ij}$,其中 $1 \leq j \leq u$。 那麼,訊息 $m$ 的一次性簽名為 $\sigma = (s_1, s_2, \dots, s_u)$,而訊息 $m$ 的完整在線/離線簽名為 $(vk, \sigma, \Sigma)$。 #### Signature Verification 為了驗證 $(vk, \Sigma, \sigma)$ 是否是訊息 $m$ 的有效簽名,驗證者需要執行以下步驟: 1. 檢查 $\Sigma$ 是否是 $vk$ 的有效 RSA 簽名,與 $VK$ 相關,即 $\Sigma^e \equiv H(vk)(mod\ n)$。 2. 檢查 $\sigma$ 是否是 $m$ 的有效一次性簽名,與 $vk$ 相關,具體步驟如下: a. 計算 $c$,即訊息 $m$ 中 0 的數量的二進位表示。 b. 形成字串 $w = m \parallel c = (a_1, a_2, \ldots, a_t)$。 c. 找出 $w$ 中 1 的坐標位置 $i_1 < i_2 < \ldots < i_u$,使得 $a_{i_j} = 1$,且 $1 \leq j \leq u$。 d. 當且僅當 $v_{ij} = h(s_j)$ 對於所有 $1 \leq j \leq u$ 時,接受 $\sigma$。 如果步驟 1 和 2 都被驗證,則 $(vk, \Sigma, \sigma)$ 是訊息 $m$ 的有效在線/離線簽名。 ### Batch Signature Scheme based on RSA > 允許一次生成或驗證多個簽名。 RSA 的批量驗證。 假設 $S_1, S_2, \ldots, S_n$ 是對雜湊值 $M_1, M_2, \ldots, M_n$ 的 RSA 簽名。 簽名者向驗證者發送配對 $(m_1, S_1), (m_2, S_2), \ldots, (m_n, S_n)$。 然後,驗證者按照以下步驟進行,使用批量驗證測試來決定 $S_i = M_i^{d} \mod N$,其中 $i = 1, \ldots, n$: 1. 計算 $H(m_i) = M_i$ 對於所有 $i = 1, 2, \ldots, n$。 2. 隨機選擇 $s_1, s_2, \ldots, s_n \in \{0,1\}^l$。 3. 計算 $x = (\prod_{i=1}^{n} S_i^{S_i})^e \mod N$ 和 $y = \prod_{i=1}^{n} M_i^{S_i} \mod N$,其中 $e$ 是簽名者的 RSA 公鑰。 4. 如果 $x = y$,則接受;否則,拒絕。 ### Server-Aided Signature Scheme based on RSA > 允許客戶從不可信的伺服器借用計算能力,而不揭露秘密。 要計算 $M^d$,首先預計算並存儲 $M^{x_0}, M^{x_1}, \ldots, M^{x_{r-1}}$,對於一些整數 $x_0, x_1, \ldots, x_{r-1}$, 然後找到 decomposition $d = \sum_{i=0}^{r-1} a_i x_i$,其中 $0 \leq a_i \leq h$ 對於 $0 \leq i \leq r - 1$。 ![圖片](https://hackmd.io/_uploads/ryBJkY0RC.png =90%x) ### ID-based Signature Scheme(IBS) #### Concept 每位參與者使用他的 ID/電子郵件 作為他的公鑰。 對應的私鑰必須由可信的中心計算,而不是由用戶自己計算。 ![圖片](https://hackmd.io/_uploads/rJxUytC00.png =65%x) #### Procedure **TC 計算**: 1. 計算 $v_1 = f(I, l)$,對於小值的 $l$。 2. 選擇 $k$ 個不同的 $l$ 值,例如 $l_1, l_2, \ldots, l_k$,使得 $v_1$ 是 modulo $N$ 的二次剩餘,並計算 $v_1^{-1}$ 模 $N$ 的最小平方根 $s_1$。 3. 發行一個智能卡,該卡包含 $I$、$k$ 個 $s_1$ 值及其索引。 **用戶 I 簽署消息**: 1. 隨機選擇整數 $r_1, \ldots, r_t \in [0, N)$,並計算 $x_i = r_i^2 \mod N$。 2. 計算 $b = f(m, x_1, \ldots, x_t)$,並將 $e_{i,j}$ 定義為 $b$ 的前 $kt$ 位,其中 $1 \leq i \leq t$,$1 \leq j \leq k$。 3. 計算 $y_i = r_i \prod_{e_{i,j=1}} s_{l_j} \mod N$,對於 $1 \leq i \leq t$。 因此,$(e_{i,j}, y_i)$ 對於所有 $1 \leq i \leq t$,$1 \leq j \leq k$ 是消息 $m$ 的簽名。 **任何人都可以驗證消息 m 的簽名 $(e, y)$**: 要驗證 $(e_{i,j}, y_i)$ 是否為消息 $m$ 的有效簽名,驗證者需要執行以下操作: ![圖片](https://hackmd.io/_uploads/S1jhZFAC0.png) **要確認簽名驗證的完成,請注意以下幾點**: ![圖片](https://hackmd.io/_uploads/ByE6-K0AA.png =80%x) ## Increase Security ### Fail-Stop Signature Scheme > 如果有人成功偽造了一個簽名,則所謂的簽署者可以證明這是偽造的。 > 一旦檢測到偽造,簽名算法將不再使用,因此稱之為 fail-stop。 #### Procedures $ Algorithms Fail-Stop Signature 為發件人提供了防範「具有無限計算能力的偽造者」的安全性。 兩種過程: 1. *Sign*:用於簽署訊息的算法。 2. *Verify*:用於驗證簽名的算法。 兩種演算法: 1. *Prove*:用於證明偽造的算法。 2. *Proof-test*:用於測試偽造證明的算法。 #### Properties 一個安全的 Fail-Stop Signature Scheme 必須滿足以下特性: 1. 如果簽署者簽署了一個訊息,則接收者可以驗證該簽名。 2. 一個「**polynomially bounded** 的偽造者」,無法創建成功通過驗證測試的偽造簽名。 3. 當一個「**unlimited computational power** 的偽造者」成功偽造了一個通過驗證測試的簽名時,假定的簽署者可以構建一個偽造證明,並說服第三方發生了偽造。 4. 一個 polynomially bounded 的簽署者,不能創建「其可以在後來證明為偽造」的簽名。 ### Arbitrated Signature Scheme > 會部署「對稱式金鑰」在數位簽章的方案。 ![圖片](https://hackmd.io/_uploads/HkZXrFA0A.png =80%x) #### Key Generation 仲裁者選擇一個秘密金鑰 $K_T$ ∈ $K$,其中 $K$ 是金鑰空間。 每個用戶 $A$ 選擇一個隨機的秘密金鑰 $K_A ∈ K$ 並通過**安全**和**可靠**的通道將其發送給仲裁者。 #### Signature Generation 為了替訊息 $m$ 生成簽名,$A$ 進行以下操作: ![圖片](https://hackmd.io/_uploads/SyZRrKA0A.png) 一但收到 $u$, $M$ 和 $I_A$,仲裁者進行以下操作: ![圖片](https://hackmd.io/_uploads/SyKb8Y00A.png =40%x) #### Signature Verification 為了驗證 Alice 在消息 $m$ 上的簽名,Bob 進行以下操作: ![圖片](https://hackmd.io/_uploads/r1uULKCRC.png =80%x) 在收到 $v$、$S$ 和 $I_B$ 後,仲裁者進行以下操作: ![圖片](https://hackmd.io/_uploads/BynILFC00.png =45%x) 在收到 $w$ 和 $M \parallel I_A$ 後,Bob 進行以下操作: ![圖片](https://hackmd.io/_uploads/ryKt8tCAR.png =50%x) ### Threshold Signature Scheme ![圖片](https://hackmd.io/_uploads/SkSzDt000.png) - *Dealing* 階段:dealer 將密鑰 $d$ 分發給 $n$ 位玩家。 - *Signature* 階段:$t$ 位玩家可以合作為訊息 $m$ 生成簽名。 ### Proactive Signature Scheme - 將 Threshold Scheme 中使用的「金鑰分配概念」與「金鑰分享更新概念」結合起來,共享金鑰會在頻繁的時間間隔內更新。 - 如果一個方案在「任何給定的時間間隔內」即使「最多有 $t$ 位玩家被破壞」,而仍然是安全和穩健的,則該方案稱 *$t$-proactive*。 ![圖片](https://hackmd.io/_uploads/BJJGOYRR0.png) ### Forward Secure Signature Scheme > 即使在 secret signing key 被竊取後,仍能保護「先前簽署」的訊息的有效性。 #### Idea 將總時間劃分為多個時間段,每個時間段使用不同的秘密金鑰。 公鑰保持不變;後續的秘密金鑰由金鑰更新算法更改。 即使當前的秘密金鑰被竊取,先前的秘密金鑰也無法從這個已揭露的金鑰計算得出。 #### Key Generation 為了生成總時間 T 的公鑰和初始秘密金鑰 $𝑠𝑘_1$,簽名者執行以下操作: ![圖片](https://hackmd.io/_uploads/S1P2ut0A0.png) ![圖片](https://hackmd.io/_uploads/SkCauYAAR.png =80%x) 然後,初始時間段的秘密金鑰為 $𝑠𝑘_1 = (1, 𝑠_1, 𝑡_2, 𝑒_1, 𝑝, 𝑁)$,而公鑰 $𝑝𝑘_1$ 為 $(𝑁, 𝑣, 𝑇)$。 #### Update Algorithm 要從先前的秘密金鑰 $𝑠𝑘_j = (1, 𝑠_j, 𝑡_{j+1}, 𝑒_j, 𝑝, 𝑁)$ 生成時間 j+1 的秘密金鑰,簽署者執行以下操作: ![圖片](https://hackmd.io/_uploads/BkN4FKCCC.png =80%x) 故新密鑰為 $𝑠𝑘_{j+1} = (j+1, 𝑠_{j+1}, 𝑡_{j+2}, 𝑒_{j+1}, 𝑝, 𝑁)$。 #### Signature Generation 為了使用當前的簽名金鑰 $𝑠𝑘_j = (1, 𝑠_j, 𝑡_{j+1}, 𝑒_j, 𝑝, 𝑁)$ 簽署消息 $m$,簽署者執行以下操作: ![圖片](https://hackmd.io/_uploads/SkyTYtA00.png =90%x) 然後 $(𝑧, 𝜎, 𝑗, 𝑒_j)$ 是消息 $m$ 的簽名。 #### Signature Verification 為了驗證 $(𝑧, 𝜎, 𝑗, 𝑒_j)$ 是消息 $m$ 的有效簽名,驗證者執行以下操作: ![圖片](https://hackmd.io/_uploads/S1Xz9F0RC.png =65%x) ## Anonymous Service ### Blind Signature Scheme > 兩名角色:Requester、Signer。 Signer 在**不知道消息內容的情況下發出盲簽名**,並且**無法將 Requester 的簽名消息與 Requester 相關聯**。 #### Signature Generation ![圖片](https://hackmd.io/_uploads/HJqV3t0AA.png =90%x) #### Signature Verification ![圖片](https://hackmd.io/_uploads/Sk5q3FAAC.png =70%x) #### Two Drawbacks 1. 未見過的「已簽章的訊息」。 2. 不可追蹤(許多副本和重複消費)。 ### Partially Blind Signature Scheme #### Blinding 為了在消息 $m$ 上獲取「包含 **common information** $𝑎$」的簽章,請求者執行以下步驟: ![圖片](https://hackmd.io/_uploads/SJDU6tARR.png =60%x) #### Signing 一收到 $(a, \alpha)$,簽章者執行以下步驟: ![圖片](https://hackmd.io/_uploads/HkTKTt00R.png =60%x) #### Unblinding > Requester -> Signer 一收到 $x$,請求者執行以下步驟: ![圖片](https://hackmd.io/_uploads/HkmRTF0RC.png =70%x) > Signer -> Requester ![圖片](https://hackmd.io/_uploads/B1IgRYC0C.png =63%x) > Requester ![圖片](https://hackmd.io/_uploads/r1vmAtACC.png =75%x) 則 $(𝑎, 𝑐, 𝑠)$ 是消息 $m$ 的**部分盲簽名**。 #### Signature verification 可以通過檢查以下內容來驗證 $(𝑎, 𝑐, 𝑠)$ 是否是消息 $m$ 的正確簽名: ![圖片](https://hackmd.io/_uploads/S1U_AKA0R.png =60%x) ### Fair Blind Signature Scheme 一個可信的第三方擁有一些額外的信息,可以用來**撤銷嫌疑犯的匿名性**。 裁判可以將簽署者「對簽署過程的觀察」與「產生的 message-signature pair」聯繫起來。 #### Key Generation 簽署者選擇一個 RSA 公鑰 $(N,e)$ 和相應的私鑰 $d$。 請求者和簽署者同意一個 session identifier $ID$,其中簽署過程的每個實例都對應於不同的 $ID$。 #### Signature Generation ![圖片](https://hackmd.io/_uploads/Bke1scC0A.png =85%x) ![圖片](https://hackmd.io/_uploads/SJPJscCAA.png =85%x) 然後,$s$ 與一組對 $𝑇 = \{(𝛼_i, 𝑣_i) |𝑖 ∉ 𝑆\}$ 是在消息 $m$ 上得到的**公平盲簽名**。 #### Signature Verification ![圖片](https://hackmd.io/_uploads/rJ5di5RRC.png =70%x) #### Fairness 假設裁判得到一個值 $𝑢_i$ 其中 $𝑖 ∈ 𝑆$。 然後,由於 $𝑢_i = 𝐸_J(𝑚 ∥ 𝛼_i)$,而 $𝐸_J$ 是裁判的加密函數,裁判可以用他的私鑰解密其中一個值,並獲得 $(𝑚 ∥ 𝛼_i)$ 對於某個 $𝑖 ∈ 𝑆$。 假設裁判得到了簽名 $(𝑠, 𝑇)$。 通過解密 $𝑇$ 中的某個 $𝑣_i$,裁判可以獲得 session identifier $ID$。 這樣,裁判就可以找到對應於給定 message-signature pair 的簽名過程實例。 ### Group Signature Scheme 允許一組成員代表整個小組簽署消息。 群組簽名可以在**不揭示簽署者身份**的情況下進行驗證。 群組管理者可以 **「揭示」簽名**,以在爭議發生時揭示簽署者的身份。 #### Key Generation 群組成員的私鑰和公鑰生成方式如下: ![圖片](https://hackmd.io/_uploads/rJWbTqCRC.png =90%x) ![圖片](https://hackmd.io/_uploads/H12b6cRCC.png =60%x) 則群組成員 $j$ 的私鑰為 $𝑠_j$,對應的公鑰為 $𝑦_j$。 #### Signature Generation 為了對消息 $𝑚 ∈ \{0,1\}^∗$ 簽名,群組成員 $j$ 執行以下操作: ![圖片](https://hackmd.io/_uploads/HyGv6qRRC.png =90%x) 故群組簽章為 $(R,S,j)$。 #### Signature Verification 為了驗證 $(𝑅, 𝑆)$ 是消息 $m$ 的有效群組簽名,驗證者執行以下操作: ![圖片](https://hackmd.io/_uploads/ry2AT5AA0.png =90%x) #### Opening Signatures 在**發生爭議**的情況下,群組管理者可以通過查找公鑰中的編號 $j$,從列表 $(𝑧_j, 𝐼_j)$ 中,識別簽署者,並獲取群組成員的身份 $𝐼_j$。 ### Ring Signature Scheme 這種簽名方法接近 Group Signature,但沒有群組管理者。 因此,**無法撤銷簽署者身份的匿名性**。 ![圖片](https://hackmd.io/_uploads/BJ0PC90AC.png =90%x) ## Increase Capability ### Proxy Signature Scheme - 允許「指定方」代表原簽署者進行簽名。 - 代理簽名的驗證方式與 Original Signature 相似。 ![圖片](https://hackmd.io/_uploads/rJRimiCCA.png =70%x) #### Original Signature $x \in \mathbb{Z}_p$ 是 A 的私鑰,$y = g^{x} \mod p$ 是 A 的公鑰。 要簽署消息 $m \in \{0,1\}^*$,原始簽署者選擇一個隨機數 $k \in \mathbb{Z}_p$,並計算: ![圖片](https://hackmd.io/_uploads/Syu7NoRCC.png =30%x) 然後 $(R, S)$ 是消息 $M$ 的簽名。 簽名驗證是通過檢查是否 $M \equiv g^{-S} y^R R(mod\ p)$ 來完成的。 這是有效的,因為: ![圖片](https://hackmd.io/_uploads/Sk07Nj00R.png =50%x) #### Key Delegation ![圖片](https://hackmd.io/_uploads/SyZJrjCR0.png =90%x) 代理簽名密鑰的驗證是可運作的,因為: ![圖片](https://hackmd.io/_uploads/SkRZBj0AA.png =70%x) #### Proxy Signature Generation ![圖片](https://hackmd.io/_uploads/ryAVSj0CR.png =75%x) #### Signature Verification 要驗證這個簽名,驗證者計算 $𝑀 = 𝐻(𝑚)$ 並檢查是否滿足 $𝑀 ≡ 𝑔^{-S}y^{'R}R\ (mod\ 𝑝)$。 如果這個方程成立,則接受該簽名,否則拒絕。 代理簽名的驗證是可運作的,因為: ![圖片](https://hackmd.io/_uploads/rJ9hBsACC.png =70%x) ### Undeniable Signature Scheme - 為簽名者提供額外的隱私,因為在**沒有簽名者合作**的情況下,無法驗證簽名。 - 只有「簽名者希望進行通訊」的各方才能驗證簽名。 - 如果簽名者「聲稱某個簽名是偽造的」,則可使用 Disavowal protocol,他有手段證明其為偽造。 - 如果簽名者「拒絕證明簽名是偽造的」,這將成為簽名有效的證據。 ![圖片](https://hackmd.io/_uploads/HJ1-UoAR0.png =90%x) #### Key Generation 每位使用者 A 執行以下步驟: ![圖片](https://hackmd.io/_uploads/S1w2Io0RR.png =90%x) 此時 A 的公鑰是 $(p,\alpha,y)$;私鑰是 $a$。 #### Signature Generation A 計算 $𝑆 = 𝑚^a\ 𝑚𝑜𝑑\ 𝑝$。 故 A 對 $m \in G$ 的簽章是 $S$。 #### Signature Verification ![圖片](https://hackmd.io/_uploads/HJ9_PiCC0.png =95%x) #### Disavowal Protocol 為了確保簽名者**正確執行驗證協議**,簽名者和驗證者之間進行以下協議: ![圖片](https://hackmd.io/_uploads/HyrswoARR.png =95%x) ![圖片](https://hackmd.io/_uploads/H1aoPs0CC.png =95%x) ![圖片](https://hackmd.io/_uploads/B1X3wo0RC.png =95%x) ### Convertible Undeniable Signature Scheme 具有附加屬性,簽名者可以**釋放一部分秘密訊息**,使其所有「Undeniable signatures」轉變為「Ordinary digital signatures」。 #### Key Generation ![圖片](https://hackmd.io/_uploads/HkREOiRAC.png) #### Signature Generation ![圖片](https://hackmd.io/_uploads/rJy8Os0R0.png =85%x) #### Signature Verification 驗證者接受簽名 $(\tilde R, S)$- 是否 $\log_{H_G(\alpha^Sy_1^{H_l(m,\tilde R)})}\tilde R \equiv log_{\alpha}\ y_2$,若等式不成立則拒絕。 要將此簽名方案轉換為普通數位簽名方案,簽署者公佈他的秘密金鑰 $x$。 然後,任何人都可以通過檢查以下條件,來驗證他的簽名: ![圖片](https://hackmd.io/_uploads/BJsw9iAAA.png =30%x) ![圖片](https://hackmd.io/_uploads/S1is5oR0C.png =90%x) ![圖片](https://hackmd.io/_uploads/ByQn5oC0C.png =90%x) ### Designated Confirmer Signature Scheme > 一種 undeniable signature,該簽名可以**由簽署者指定的第三方證明其有效性**。 設 $p$ 是一個大質數,使得在 $\mathbb{Z}_{p}^{*}$ 中的離散對數問題是 generator。 設 $(N,e)$ 是簽署者的 RSA 公鑰,其中 $d$ 是對應的私鑰。 確認者的私鑰是 $\mathcal{z} \in \mathbb{Z}_{p}^{*}$,對應的公鑰是 $h = g^{\mathcal{z}} \mod p$。 #### Signing Protocol ![圖片](https://hackmd.io/_uploads/Byc9ojACR.png =90%x) ![圖片](https://hackmd.io/_uploads/r1msjiAA0.png =90%x) #### Confirmation Protocol ![圖片](https://hackmd.io/_uploads/rJ92joAAA.png =90%x) ![圖片](https://hackmd.io/_uploads/BJWpij0AC.png =90%x) #### Conversion Protocol ![圖片](https://hackmd.io/_uploads/BJH1hsR0R.png =90%x)