📜 [專欄新文章] 私鑰分割 — Shamir’s Secret Sharing
✍️ Kimi Wu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
私鑰分割 — Shamir’s Secret Sharing
在做區塊鏈應用的時候,最常碰到的一個問題就是,怎麼保管私鑰,怎麼讓使用者方便,但又同時是安全的。第一個想法就是備份金鑰(不論是passphrase/keystore/私鑰),但是如果把使用者金鑰(加密)備份到自己的server,只要server的安全上有個不小心,使用者的金鑰就可能就被盜取了,就算是加密過的,也難保不會被破解。那如果切成好幾部分,有好幾份備份呢? 那怎麼切,才能確保安全呢?這就是本篇的重點啦!
最直覺的想法就是直接切成N等份,例如32bytes的私鑰分成四份,然後任三份可以組成完整的私鑰,這樣每份至少需要11 bytes。聽起來問題好像解決了,但要怎麼切分,可以保證4取3可以完整組回私鑰,又是另一個麻煩的問題(自己寫的演算法,如果沒有被完整測試過,屆時使用者的私鑰組不回來,公司的問題就大了)。ZeroPass有作切分金鑰並且提供備份的服務,不過找不到他們背後的演算法,後來google到Shamir’s Secret Sharing,覺得很酷,在概念上用很簡單的數學就解決了這個問題,所以在這裡跟大家分享。
我是參考這篇,淺顯易懂,不介意看英文的可以直接看。
如何拆分
先定義一下要我們接下來要幹嘛
把秘密(secret)拆分成N份,並且只需M(M < N)份即可組回完整的秘密,被拆分過的每一份秘密叫做share。
建立一個(M-1)次方程式
假設,我們要傳遞的秘密是數字3,然後希望3份(M=3)就能回復完整的秘密,所以要建立一個一元二次(M-1)方程式,y=ax ²+bx+c。
a跟b可以任選,而c是秘密(在我們的例子就是3),我們選a=2, b=1,所以方程式為y=2x ²+x+3。
接著,我們任意取三點(因為M=3),(1, 6),(2, 13),(-2, 9)
而這三個點座標就是三個share。最終可以由這三個點座標(share)還原秘密(secret)。
如何還原
目標是,還原(M-1)次方程式。
若能取得原本的方程式,即可拿到秘密。我們知道兩點可以成一直線,而三點可以定義一個拋物線。現在,我們有三個點(1, 6),(2, 13),(-2, 9),但不知道曲線
不過M=3,所以可以知道方程式為y=ax ²+bx+c,然後,我們知道三個座標(1, 6),(2, 13),(-2, 9),接著就是國中數學了 (1, 6) => c = a + b -6 (2 13) => c = 4a + 2b -13 (-2, 9) => c = 4a -2b - 9 過程就不推導了,最後就可以得出a=2, b=1然後我們的秘密數字c=3。 是不是很神奇啊! 在GitHub上簡單找了一些實作,有需要的可以參考一下Shamir’s Secret Share in JavaShamir’s Secret Sharing in CShamir’s Secret Sharing in Golang
Originally published at kimiwublog.blogspot.com.
私鑰分割 — Shamir’s Secret Sharing was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
Search