橢圓曲線來數字簽名每次簽名都不一樣?

橢圓曲線為啥用自己的私鑰每次簽名得出的簽名都不一樣,同時公鑰能夠識別是否是對應私鑰簽名的,好神奇


如果把密碼學裡的數字簽名看成有兩個輸入一個輸出的函數f(x,y) = z

,那麼私鑰是x,被簽名的消息是y, 得出來的簽名z是跟x,y同時綁定的,注意是「同時」。

所以,用同樣的私鑰給不同的文件/消息簽名,得出來的簽名是不同的。

如果f()內部在每次執行簽名的時候還會產生一個隨機數的話,那麼這個隨機數通常也會直接或者間接成為z的一部分,這樣的話,即使文件相同,在不同時間進行的簽名也會不同

否則,簽名就很容易被偽造到另一份文件上了。不僅僅是實用的橢圓曲線簽名演算法有這個性質,其他的簽名演算法,比如實用的RSA或者ElGamal簽名,也有這個性質。

放在人的身上,就可以理解為,即使是你自己用同一支筆給文件簽名,簽在兩份文件上的簽名也並不是完完全全相同。(當然,人簽名的情況其實更複雜)

=============分割線===============

下面補充回答怎麼驗簽

拿「教科書式RSA簽名」來做個例子吧。(評論里不能用latex公式,我就搬到答案里了)

簽名用的是一對鑰匙(d,e)。N是兩個大素數的乘積。

其中d是私鑰,簽名者用d來簽名。e是接收方用來驗證簽名的鑰匙,也就是公鑰。

e、d兩者滿足d cdot e = 1mod phi(N)

產生簽名 Sign(m, d):

對於消息m (任意正整數), 簽名是 sigma = m^d mod N

驗證簽名 Verify(m, sigma)

計算sigma ^e mod N

如果簽名的確是用d簽在m上的,則有

sigma ^e = m ^{d cdot e} mod N = m mod N (第二個等號來自歐拉定理 (數論) 和 上面提到的d*e性質)

滿足這個條件就是合法的簽名了。

否則,簽名無效。

這個簽名的(有限的)安全性來自於當N足夠大的時候,並且e和d差不多大的時候,無法在多項式時間內,從公開的信息e和N算出沒公開的簽名密鑰d。

實際應用中,m可能和一組隨機量組合,並且hash(比如使用SHA-3),然後再簽名簽在這個hash值上。安全性基於從公鑰計算私鑰的複雜性,以及hash對碰撞的抵抗性。

橢圓曲線主要是提供了更難計算離散對數問題的群和對Bilinear Map的支持,這個比較複雜,沒法幾百個字就說清楚。原則上來說,驗證一個簽名,就是用一個函數把公鑰、消息、簽名當輸入(注意,私鑰在這裡沒有直接出現),計算一個特定的「等於」關係。


剛翻了遍SM2簽名的文檔

簽名中會產生隨機數

A3:用隨機數發生器產生隨機數k

A4:通過k計算橢圓曲線點

SM2為選定曲線的ECC


公鑰之所以能夠識別對應私鑰簽名的不同的簽名值,這神奇的地方,在於使用了隨機數,而簽名後的簽名值中包含了這隨機數信息,而在驗簽過程中隨機數被成功脫掩了。所以看上去不同的簽名值都能正確的驗簽回來。


只說國標SM2的。樓上已經有人回答地不錯了,我就針對具體實例說一下。

先引用下國家安全局公布的SM2的簽名流程:

——————————————————————

————————————————————————————

所以即使在k 確定的情況下,針對不同的簽名信息M,在第二步 利用M在雜湊函數下生成e的過程,就會導致許多的隨機性。自然而然,對應後續過程,必然牽一髮而動全身,變數很多。


推薦閱讀:

如果我隨意打出亂碼,可不可以用密碼學解出有意義的信息?
為什麼計算機科學如密碼學喜歡用 Alice 和 Bob 舉栗子?
問題:AES128和AES256主要區別和安全程度是多少?他們對於機器的消耗是怎樣的?兩者性能如何?實際開發如何選擇?
密碼學與黑客技術有什麼關係?
跪求神人解這個密碼:744x0l?

TAG:信息安全 | 簽名 | 密碼 | 密碼學 |