通常簽署涉及消息的哈希值...
所以(簡體)過程是
把你的消息M和計算H1 =散列(M)
把你的私鑰Kpriv並計算S =符號(H1,KPriv)
附加s到M和傳輸到收件人
接收者計算H2 =散列(M)
,然後把你的公鑰KPub計算驗證(S,KPub,H2)=真/假
(因爲你在步驟3提起類似的簽名「解碼」 ......),你可以熟悉在RSA情況下sign()和verify()後面的操作確實是encrypt()和decrypt()的事實,但請注意,這不適用於每個簽名算法,並且確實是一個特例與RSA
所以情況可能將變得更加清晰,如果我們看看一個例子:
在RSA的情況下驗證(S,KPub,H2)
從以上是:H2 ==解密(S,KPub)
這適用於RSA,因爲從數學的角度來看,公私指數是可以互換的,加密和解密背後的數學運算是非常相似的。 。因此,上述變成H2 == POW(POW(H1,d),e)mod N ... N是模數,d是私人指數,e是公開指數...因爲e和d是選擇的(在密鑰對創建時),使得e * d mod phi(N)= 1 ...用phi()作爲eulers phi函數...計算成爲H2 == POW(H1,1)mod N ...(fermat's小定理)...歸結爲H2 == H1 ...
H1由簽名者計算... H2是由收件人計算的......如果這兩者相互匹配,則存在一定的可能性該消息是真實的我知道了 ...當然如果攻擊者可以使用散列(M)==散列(M')來選擇M和M',換句話說,如果某人可以爲2條消息找到散列衝突,則簽名變得毫無用處......您將驗證S,KPub,哈希(M「))==真實的,即使簽名人從未見過的M」
因此與已經說了這一切......回到你最初的問題......
會發生什麼如果攻擊者利用他在verify()或你的例子SomeAlgorithm2()中計算的內容的知識......?
允許從所有這些剝離散列...和代替處理散列我們對消息M直接操作...
YES的確,在RSA例如,攻擊者可以選自S在恢復中號這種情況下(假設M足夠小,不會被N模被截斷)
但攻擊者將得到原始消息,...,M ......他已經知道了......所以是......他可以送那給別人......使用S ...一起,他也已經知道......
他沒有贏過,因爲他不能沒有打破signat改變中號URE ...
前面已經說了...... RSA是因爲加密,解密簽名和驗證......一切都歸結到同一個數學運算的特殊情況......
只要你包括散列所有你能恢復的散列...但仍然是與其他算法簽署
非常相同的哈希值,你有時沒有其他任何真正/最終假的... ...
但所有這些都不是重點......你所說的信息並不是祕密......它確實是簽署了同樣的信息。 ..
攻擊者不僅需要得到來自檢驗過程的信息......他需要能夠在併購真正改變的東西,並計算由此產生的變化與S ...
如果他能爲此,他已經打破了簽名算法
作爲替代,他可以嘗試以上......在這種情況下,他並沒有真正破壞簽名,因爲它仍然是相同的值描述打破哈希函數...但他能夠打破這種有目標,證明M的真實性的系統......它就像一個信任鏈...它作爲最薄弱的環節
強
整個主題是很多比這更復雜,但我認爲這是確定爲初學者簡化破敗......還有,如果RSA簽名系統,在這個簡單的方式實現,而不能夠暴露私鑰的攻擊向量進一步的預防措施...所以...不要!
這只是爲了展示一下實際發生的與簽約在這種情況下驗證......一個真實世界中的實現,你將需要包括填充和進一步的消息結構和標識符...的方式複雜,簡單的所以回答...
非常感謝,很好的解釋。 – Aleksa