橢圓曲線來數字簽名每次簽名都不一樣?
01-02
橢圓曲線為啥用自己的私鑰每次簽名得出的簽名都不一樣,同時公鑰能夠識別是否是對應私鑰簽名的,好神奇
如果把密碼學裡的數字簽名看成有兩個輸入一個輸出的函數
,那麼私鑰是x,被簽名的消息是y, 得出來的簽名z是跟x,y同時綁定的,注意是「同時」。所以,用同樣的私鑰給不同的文件/消息簽名,得出來的簽名是不同的。
如果f()內部在每次執行簽名的時候還會產生一個隨機數的話,那麼這個隨機數通常也會直接或者間接成為z的一部分,這樣的話,即使文件相同,在不同時間進行的簽名也會不同。否則,簽名就很容易被偽造到另一份文件上了。不僅僅是實用的橢圓曲線簽名演算法有這個性質,其他的簽名演算法,比如實用的RSA或者ElGamal簽名,也有這個性質。放在人的身上,就可以理解為,即使是你自己用同一支筆給文件簽名,簽在兩份文件上的簽名也並不是完完全全相同。(當然,人簽名的情況其實更複雜)=============分割線===============
下面補充回答怎麼驗簽 拿「教科書式RSA簽名」來做個例子吧。(評論里不能用latex公式,我就搬到答案里了)簽名用的是一對鑰匙(d,e)。N是兩個大素數的乘積。其中d是私鑰,簽名者用d來簽名。e是接收方用來驗證簽名的鑰匙,也就是公鑰。e、d兩者滿足
產生簽名 Sign(m, d):對於消息m (任意正整數), 簽名是 驗證簽名 Verify(m, )計算如果簽名的確是用d簽在m上的,則有
(第二個等號來自歐拉定理 (數論) 和 上面提到的d*e性質)滿足這個條件就是合法的簽名了。否則,簽名無效。這個簽名的(有限的)安全性來自於當N足夠大的時候,並且e和d差不多大的時候,無法在多項式時間內,從公開的信息e和N算出沒公開的簽名密鑰d。
實際應用中,m可能和一組隨機量組合,並且hash(比如使用SHA-3),然後再簽名簽在這個hash值上。安全性基於從公鑰計算私鑰的複雜性,以及hash對碰撞的抵抗性。橢圓曲線主要是提供了更難計算離散對數問題的群和對Bilinear Map的支持,這個比較複雜,沒法幾百個字就說清楚。原則上來說,驗證一個簽名,就是用一個函數把公鑰、消息、簽名當輸入(注意,私鑰在這裡沒有直接出現),計算一個特定的「等於」關係。剛翻了遍SM2簽名的文檔
簽名中會產生隨機數
A3:用隨機數發生器產生隨機數kA4:通過k計算橢圓曲線點SM2為選定曲線的ECC公鑰之所以能夠識別對應私鑰簽名的不同的簽名值,這神奇的地方,在於使用了隨機數,而簽名後的簽名值中包含了這隨機數信息,而在驗簽過程中隨機數被成功脫掩了。所以看上去不同的簽名值都能正確的驗簽回來。
只說國標SM2的。樓上已經有人回答地不錯了,我就針對具體實例說一下。
先引用下國家安全局公布的SM2的簽名流程:——————————————————————————————————————————————————
所以即使在k 確定的情況下,針對不同的簽名信息M,在第二步 利用M在雜湊函數下生成e的過程,就會導致許多的隨機性。自然而然,對應後續過程,必然牽一髮而動全身,變數很多。推薦閱讀:
※如果我隨意打出亂碼,可不可以用密碼學解出有意義的信息?
※為什麼計算機科學如密碼學喜歡用 Alice 和 Bob 舉栗子?
※問題:AES128和AES256主要區別和安全程度是多少?他們對於機器的消耗是怎樣的?兩者性能如何?實際開發如何選擇?
※密碼學與黑客技術有什麼關係?
※跪求神人解這個密碼:744x0l?