簡體   English   中英

.NET 3.5 Cryptography實現與Mono 2.x實現之間的區別?

[英]Difference between .NET 3.5 Cryptography implementation and Mono 2.x implementation?

我在Mono(Unity 4.5)和MS .NET下編譯和運行相同的代碼:

DSAParameters privateKey;
...
DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(csp);
dsa.PersistKeyInCsp = false;
dsa.ImportParameters(privateKey);

從磁盤加載私鑰,加載的字節和“privateKey”中設置的整數在Mono和MS .NET版本中是相同的。

在.NET版本中,dsa.ImportParameters拋出“錯誤數據”異常。

我努力了

  • 不同的.NET設置(3.5最小,AnyCPU / x86 / x64)
  • 不同的密鑰(一些拋出,有些沒有,但.NET簽名在我驗證時總是(?)無效,而使用相同的密鑰和Mono中的相同消息生成的那些工作正常。)

MS DSA實施方式和Mono工作方式之間是否存在一些根本性的差異,這可能會導致這種情況......?

任何燈棚都是最受歡迎的......這有點令人頭疼......

更多信息:

  • 密鑰是在Java中生成的,並在從DER格式轉換為與.NET一起使用后導出(P1363;只是一個接一個的大整數)
  • 使用BinaryReader從光盤加載密鑰,並將作為byte []加載的整數值加載到DSAParameters(P,Q,G和X)中
  • 公鑰加載在Java應用程序中,該應用程序使用Oracle實現來驗證簽名
  • 所有C#代碼都是“對稱的”,即在Mono和MS .NET應用程序中按原樣使用。

更新2

好吧,我不會生氣; 今天早上我再次嘗試; 相同的.NET應用程序在Mac上運行(使用Mono Develop,普通版)和Windows上的一個(Visual Studio 2010)。 加載相同的私鑰字節,相同的代碼路徑(至少就C#而言) - 僅限Windows上的“壞數據”異常。 這是關鍵:

P: 17801190547854226652823756245015999014523215636912067427327445031444286578873
70207706126952521234630795671567847784664499706507709207278570500096683881440341
29745221171818506047231150039301079959358067395348717066319802262019714966524135
060945913707594956514672855690606794135837542707371727429551343320695239

Q: 864205495604807476120572616017955259175325408501

G: 17406820753240209518581198012352343653860449079456135097849583104059995348845
58231478515974089409507253077970949157594923683005742524387610370844734671801488
76118103083043754985190983472601550494691329488083395492313850000361646482644608
492304078721818959999056496097769368017749273708962006689187956744210730

X: 3505625379966178555918512548923624458026758122

...

.NET Framework期望維護一些大小關系:

  • 問:20個字節
  • G:與P相同的長度
  • Y,如果存在:與P相同的長度
  • 種子,如果存在:20個字節
  • X,如果存在:20個字節

這些只是底層加密提供程序的傳遞要求: https//msdn.microsoft.com/en-us/library/windows/desktop/aa381987(v = vs。85)。aspx# PRIVK_BLOB

根據上面的值的長度,您可能需要左鍵填充X和零。

簡短的回答是,.NET Framework版本和平台之間的哈希碼可能不同,例如32位和64位平台; 或者在Microsoft和Mono之間。

這可以在這里閱讀: Object.GetHashCode ,閱讀備注。

我在Unity3D開發跨平台多人游戲之前遇到過這種情況。 因此,您需要使用自己的哈希函數,或使用對稱算法來加密數據。

從文檔中我讀到DSACryptoServiceProvider本質上是非對稱的,並使用哈希來創建數字簽名。 這是鏈接: DSACryptoServiceProvider類 ,閱讀備注。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM