實際問題。為了將這種籤名機制的思想現實應用起來,算法上有很多事要做。例如,有些過程的算法需要是隨機的(特別是比特幣中使用的),因此我們需要實現好的隨機性算法。好隨機性的重要性不能被低估,不好的隨機性會使你的計算不安全。
另一個實際的問題是信息的大小。在現實中,能籤署的信息是有大小限制的,因為你要運行計算是基於有長度限制的字符串的。解決這個限制的方法也很簡單:使用信息的哈希值而非信息本身。如果我們使用一個256位輸出值的加密哈希函數,那我們就能夠通過256位的信息來籤署任何長度的信息了。並且,因為哈希函數是免碰撞的,將信息的哈希值而不是信息本身用作數字籤名的輸入,也是安全的。
另外,我們在後面還會用到的一個有用技巧是可以籤署一個哈希指針。如果你對一個哈希指針做數字籤名,你的籤名將覆蓋或者保護整個結構。例如,如果你對一個區塊鏈的哈希指針做了數字籤名,其結果是,你對整個區塊鏈的內容都做了有效的數字籤名。
ECDSA。現在來說點具體的,比特幣採用了一種特別的數字籤名方案叫橢圓曲線數字籤名算法(ECDSA),該算法也是美國政府的數字籤名標準,是早先的DSA算法在使用橢圓曲線後的更新。在過去幾年裡,這些算法已經通過了大量的加密分析,通常被認為是安全的。
更具體地說,比特幣使用基於標準橢圓曲線「secp256k1」的ECDSA, 「secp256k1」預計能夠提供128位的密保。而這個曲線是一個公開的標準,除了比特幣,它很少被使用,其他的應用通常使用更常見的「secp256r1」的ECDSA。這只是比特幣的一個怪癖,這是由Satoshi在早期的系統規格中選取的,現在已經很難去修改了。
我們不會細緻地討論ECDSA是如何工作的,因為這涉及到很多複雜的數學知識,而且就算你理解了,這對之後的課程也沒有多大的幫助。
關於ECDSA,好的隨機性是必須的,因為差的隨機性可能會洩露你的密鑰。直觀的感覺就是,如果你使用差的隨機性生成了一個密鑰,那麼你生成出的密鑰將會是不安全的。但是在ECDSA,如果你在籤名的時候隨機性不好,即便密鑰是完美的,這也有可能洩露你的私鑰,一旦私鑰洩露,那麼一切都完了,攻擊者就能夠複製你的籤名。因為在實際操作中我們需要非常注意這一點,這是個常見的錯誤。
討論數字籤名的密碼學基礎就到此為止,下一節我們將繼續討論數字籤名的一些應用,這些應用在構造加密貨幣時是很有用的。
本文由維優翻譯自普林斯頓比特幣公開課,如欲轉載本帳號文章,請註明作者譯者及內容來源於維優。