作為 Schnorr 簽名中挑戰的一部分,nonce 真的必須進行散列嗎?
文章指出,挑戰
e = H(P || m)
是不安全的,e = H(R || P || m)
應該使用它。簽名是,私鑰s = k * e
在哪裡。k
我的問題是:如果我們使用不安全的挑戰
e = H(P || m)
並將隨機數部分作為簽名的一部分,如下所示:s = r + (k * e)
?這仍然是安全的,還是有辦法用這種方法提取私鑰?我嘗試修改 Rust 程式碼範例,看看是否仍然可以使用這種修改後的簽名方案從公共資訊中提取密鑰,但看起來仍然不可能:
extern crate libsecp256k1_rs as secp256k1; use secp256k1::{SecretKey, PublicKey, thread_rng, Message}; use secp256k1::schnorr::{ Challenge}; // This one tests that adding r/R makes key extraction impossible #[allow(non_snake_case)] fn main() { // Create a random private key let mut rng = thread_rng(); let r = SecretKey::random(&mut rng); println!("My private random value is: {}", r); let R = PublicKey::from_secret_key(&r); let k = SecretKey::random(&mut rng); println!("My private key: {}", k); let P = PublicKey::from_secret_key(&k); // Challenge, e = H(P || m) let m = Message::hash(b"Meet me at 12").unwrap(); let e = Challenge::new(&[&P, &m]).as_scalar().unwrap(); // Signature (with nonce) let s = r + (e * k); // Verify the signature assert_eq!(PublicKey::from_secret_key(&s), R + (e*P)); println!("Signature is valid!"); let hacked = s * e.inv(); assert_eq!(k, hacked); // fails println!("Hacked key: {}", k) }
公鑰下的簽名 $ P $ 是一對 $ (R,s) $ 這樣 $ [s]G = R + [e]P $ , 在哪裡 $ G $ 是標準基點,並且 $ e $ 是挑戰。
如果 $ e = H(P, m) $ 不涉及 $ R $ ,那麼我可以選擇 $ s $ 任意計算 $ R = [s]G - [e]P $ 偽造我想要的任何簽名。
Schnorr 簽名方案的動機是 Schnorr 辨識協議,名為 Peggy 的證明者旨在說服名為 Victor 的驗證者她知道秘密 $ k $ 這樣 $ P = [k]G $ -那是, $ \log_G P $ , 的離散對數 $ P $ . 對話是這樣的:
維克多(給定 $ P $ ):嘿佩吉,你知道嗎 $ \log_G P $ ?
PEGGY(選擇 $ r $ 均勻隨機地計算 $ R = [r]G $ ): 是的,但我不能直接告訴你。相反,這是我知道的另一點離散日誌: $ R $ .
維克多(選擇 $ e $ 均勻隨機):好的。你能告訴我什麼嗎 $ \log_G R + e \log_G P $ 是?
PEGGY(計算 $ s := r + e k $ ): 為什麼,是的,事實上——它是 $ s $ .
維克多(確認 $ [s]G \stackrel?= R + [e]P $ ):哇……好吧,我想也許你知道 $ \log_G P $ .
該協議保證不洩露 $ k $ 只要佩吉選擇 $ r $ 維克多選擇 $ e $ 每次都獨立且均勻地隨機——換句話說,它是一個誠實驗證者的零知識協議。
這個協議對 Victor 很有說服力,因為如果你把 Peggy 想像成一台機器(典型的像 Victor 這樣的人在父權社會中做的事!),你在中間暫停計算並在兩個不同的挑戰下執行它 $ e $ 和 $ e’ $ , 然後是結果值 $ s $ 和 $ s’ $ 導致恢復 $ k $ 經過 $ (s - s’)/(e - e’) $ , 所以除非 Peggy跑得非常幸運(我們為 $ e $ 如此之大以至於這不合理),她必須知道 $ k $ .
另一方面,如果佩吉不選擇 $ R $ 在她已經知道挑戰是什麼之前,她可以選擇 $ s $ 任意然後導出 $ R := [s]G - [e]P $ . 這就是為什麼她致力於 $ R $ 首先與維克多分享。
我們通過Fiat-Shamir 啟發式將該協議轉換為簽名方案:我們通過隨機預言機模擬 Victor會選擇的挑戰;然後,我們得到的不是互動,而是 Peggy 可以自己計算的非互動式收據,世界上任何人都可以稍後驗證,無需與 Peggy 進一步互動。 但是,要使 Fiat-Shamir 啟發式算法起作用,我們必須傳遞Peggy 迄今為止在協議中對 Victor 所做的所有承諾。 這意味著,在這種情況下,我們必須傳入 $ R $ 和任何資訊 $ m $ 佩吉想要證明。
你不是第一個對此感到疑惑的人!這個技巧——忘記散列 $ R $ 連同其他所有東西——最近被瑞士選舉當局用來說服密碼學家他們新奇的電子投票系統是可驗證的——以及其他一些技巧——儘管有大量關於密碼數字化的論文來證明他們的軟體是正確的。新南威爾士州選舉當局也使用相同的軟體,儘管同時被警告該問題。