對於我在這個帖子中提到的專案,我正在構建一個節點網路,這些節點將透過gRPC相互通訊。我將使用SSL/TLS(實際上是mTLS)不僅用於加密,更重要的是用於身份驗證,以便每個節點確切地知道它正在與哪個節點通訊,或者更確切地說,知道對等方的公鑰/錢包地址。當然,一個完全去中心化的專案不能有任何中心化元件,因此不會涉及任何認證機構,所有SSL證書都將是自簽名的。
現在,問題來了。原則上,自簽名證書證明了私鑰的所有權,所以我可以簡單地對錢包和自簽名證書使用相同的金鑰對,這樣對等方就能確切地知道它正在與哪個錢包通訊,即使證書是自簽名的。然而,我幾乎肯定會在我的錢包中使用Pallas曲線上的Schnorr簽名方案(歡迎詢問原因),但不幸的是,SSL不支援。
可能的解決方案
正如你在同一個帖子中看到的,我最近開始學習橢圓曲線密碼學和Schnorr方案。我瞭解到金鑰推導獨立於簽名方案,它只取決於特定的曲線。所以這給了我一個想法:我能否對錢包和自簽名證書使用相同的私鑰標量,然後以某種方式證明兩個生成的公鑰(證書的Ed25519公鑰和錢包的Pallas公鑰)是相關的,並共享相同的私鑰?
看起來我可以接近這一點。我將不得不實現相當多的自定義密碼學,這可能存在風險,但我認為仍然值得追求。
除了通常的欄位外,我的mTLS證書還將包含:
- 節點錢包的公共Pallas金鑰,
- 零知識證明,以說服對等方Ed25519公鑰和Pallas公鑰是相關的,而不洩露私鑰。
後者基本上是在兩條曲線(25519和Pallas)上計算的"雙重"Schnorr風格簽名。如果簽名在兩條曲線和兩個公鑰上都透過驗證,則對等方會信服。
需要注意的一個方面是,私鑰標量必須在兩條曲線的域中有效,因此必須嚴格小於min(n_{25519}, n_{Pallas})min(n25519,nPallas),其中n_CnC是曲線CC的標量域階(不要與基礎域階混淆)。這似乎不是問題,因為兩條曲線的標量域階都在2^{25something}225something附近(2^{252}2252用於25519,2^{255}2255用於Pallas,看起來是這樣)。




