[英]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拋出“錯誤數據”異常。
我努力了
MS DSA實施方式和Mono工作方式之間是否存在一些根本性的差異,這可能會導致這種情況......?
任何燈棚都是最受歡迎的......這有點令人頭疼......
更多信息:
更新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期望維護一些大小關系:
這些只是底層加密提供程序的傳遞要求: 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.