成字的數(shù)字簽名怎么寫?
如果把密碼學里的數(shù)字簽名看成有兩個輸入一個輸出的函數(shù),那么私鑰是x,被簽名的消息是y, 得出來的簽名z是跟x,y同時綁定的,注意是“同時”。所以,用同樣的私鑰給不同的文件/消息簽名,得出來的簽名是不同的。如果f()內(nèi)部在每次執(zhí)行簽名的時候還會產(chǎn)生一個隨機數(shù)的話,那么這個隨機數(shù)通常也會直接或者間接成為z的一部分,這樣的話,即使文件相同,在不同時間進行的簽名也會不同。否則,簽名就很容易被偽造到另一份文件上了。不僅僅是實用的橢圓曲線簽名算法有這個性質(zhì),其他的簽名算法,比如實用的RSA或者ElGamal簽名,也有這個性質(zhì)。放在人的身上,就可以理解為,即使是你自己用同一支筆給文件簽名,簽在兩份文件上的簽名也并不是完完全全相同。(當然,人簽名的情況其實更復雜)=============分割線===============下面補充回答怎么驗簽 拿“教科書式RSA簽名”來做個例子吧。(評論里不能用latex公式,我就搬到答案里了)簽名用的是一對鑰匙(d,e)。N是兩個大素數(shù)的乘積。其中d是私鑰,簽名者用d來簽名。e是接收方用來驗證簽名的鑰匙,也就是公鑰。e、d兩者滿足產(chǎn)生簽名 Sign(m, d):對于消息m (任意正整數(shù)), 簽名是 驗證簽名 Verify(m, )計算如果簽名的確是用d簽在m上的,則有 (第二個等號來自歐拉定理 (數(shù)論) 和 上面提到的d*e性質(zhì))滿足這個條件就是合法的簽名了。否則,簽名無效。這個簽名的(有限的)安全性來自于當N足夠大的時候,并且e和d差不多大的時候,無法在多項式時間內(nèi),從公開的信息e和N算出沒公開的簽名密鑰d。實際應用中,m可能和一組隨機量組合,并且hash(比如使用SHA-3),然后再簽名簽在這個hash值上。安全性基于從公鑰計算私鑰的復雜性,以及hash對碰撞的抵抗性。橢圓曲線主要是提供了更難計算離散對數(shù)問題的群和對Bilinear Map的支持,這個比較復雜,沒法幾百個字就說清楚。原則上來說,驗證一個簽名,就是用一個函數(shù)把公鑰、消息、簽名當輸入(注意,私鑰在這里沒有直接出現(xiàn)),計算一個特定的“等于”關(guān)系。