私钥分割 — Shamir Secret Sharing

在做区块链应用的时候,最常碰到的一个问题就是,怎么保管私钥,怎么让使用者方便,但又同时是安全的。第一个想法就是备份密钥(不论是passphrase/keystore/私钥),但是如果把使用者密钥(加密)备份到自己的server,只要server的安全上有个不小心,使用者的密钥就可能就被盗取了,就算是加密过的,也难保不会被破解。那如果切成好几部分,有好几份备份呢?那怎么切,才能确保安全呢?这就是本篇的重点啦!

最直觉的想法就是直接切成N等份,例如32bytes的私钥分成四份,然后任三份可以组成完整的私钥,这样每份至少需要11 bytes。听起来问题好像解决了,但要怎么切分,可以保证4取3可以完整组回私钥,又是另一个麻烦的问题(自己写的算法,如果没有被完整测试过,届时使用者的私钥组不回来,公司的问题就大了)。

ZeroPass有作切分密钥并且提供备份的服务,不过找不到他们背后的算法,后来google到Shamir’s Secret Sharing,觉得很酷,在概念上用很简单的数学就解决了这个问题,所以在这里跟大家分享。

我是参考这篇,浅显易懂,不介意看英文的可以直接看。

如何拆分

先定义一下要我们接下来要干嘛

1.把秘密(secret)拆分成N份,并且只需M(M < N)份即可组回完整的秘密,被拆分过的每一份秘密叫做share。
2.建立一个(M-1)次方程序

假设,我们要传递的秘密是数字3,然后希望3份(M=3)就能回复完整的秘密,所以要建立一个一元二次(M-1)方程式,y=ax²+bx+c。

私钥分割 — Shamir Secret Sharing_第1张图片

a跟b可以任选,而c是秘密(在我们的例子就是3),我们选a=2,b=1,所以方程式为y=2x²+x+3。
接着,我们任意取三点(因为M=3),(1,6),(2,13),(-2,9)
私钥分割 — Shamir Secret Sharing_第2张图片

而这三个点坐标就是三个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。是不是很神奇啊!

总结

  • M-1次方的方程有M个未知的系数(比如上面,M=3,系数为a, b, c)只需要M个线性不相关的等式就可以求解这些系数。
  • 这些系数是随机数,在构造私钥的时候和加密数字c的时候它们是已知的;如果每一个私钥里面都包含(x,y)的具体值(相当于M个点,每一个点重合),那么只要M个私钥就可以构成M个方程,来求解这M个系数了。

你可能感兴趣的:(区块链,密码学,密码学,区块链)