2014-01-08 122 views
1

我已經在窗口中使用BCryptSignHash與ECDSA算法簽署了哈希值。輸出簽名緩衝區的長度爲64個字節。我還使用BCryptGenerateKeyPair函數(BCRYPT_ECDSA_P256_ALGORITHM算法)生成了公鑰和私鑰blob,並使用該函數對散列進行了簽名。瞭解BCryptSignHash輸出簽名

我必須在linux中使用此密鑰對驗證此簽名。我能夠使用鏈接「http://msdn.microsoft.com/en-us/library/windows/desktop/aa375520%28v=vs.85%29.aspx」解密生成的公鑰 - 私鑰對,並能夠在Linux中使用相同的密鑰對。

生成的64字節簽名理想情況下應該是簽名對(r,s)(http://en.wikipedia.org/wiki/Elliptic_Curve_DSA)。

有沒有辦法理解生成的64字節簽名,以便我可以將簽名blob內容映射到(r,s)對在Linux中並驗證它?

還是有更簡單的方法來驗證在linux生成的簽名?

謝謝, ˚F

回答

2

有一種方法來了解產生,這樣我可以在Linux映射簽名團塊內容(R,S)對並驗證它在64字節的簽名?

rs在P1363格式,它是簡單的和rs作爲2的補碼格式的級聯。也就是說,簽名只是r || s

你需要知道散列才能使用這種格式。例如,SHA1將創建20字節的r和20字節的s。如果rs是「太短」,那麼它在左側用0填充。

Java和OpenPGP與P1363不同。 Java和OpenPGP的使用ASN.1編碼:

SEQUENCE ::= { 
    r INTEGER, 
    s INTEGER 
} 

根據您在Linux上使用什麼庫,你可能不得不格式之間的轉換。 Cryptographic Interoperability: Digital Signatures給出了使用幾個不同的庫進行簽名和驗證的示例。


或者是有一個更簡單的驗證在Linux中產生的簽名呢?

嘗試Crypto++。我相信Microsoft和Crypto ++使用相同的簽名格式,因此您不需要轉換。詳情請參閱Elliptic Curve Digital Signature Algorithm

+0

感謝您的信息..我試過crypto ++,並且我能夠在Windows和Linux應用程序級別使用簽名和密鑰。 但現在我得到了另一個問題來處理... | 正在Windows應用程序級別完成簽名。驗證必須在2個地方完成 - linux應用程序和Windows驅動程序。 Crypto ++在Windows應用程序級別創建密鑰時非常有用,並且我在數據上簽名。使用相同的密鑰,我能夠在Linux應用程序中驗證數據。現在我遇到的問題是我不能在Windows驅動程序中使用crypto ++。 是否有3種格式的公共圖書館? – Fazlin