我在 Mono (Unity 4.5) 和 MS .NET 下编译和运行相同的代码:
DSAParameters privateKey;
...
DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(csp);
dsa.PersistKeyInCsp = false;
dsa.ImportParameters(privateKey);
私钥是从磁盘加载的,在 Mono 和 MS .NET 版本中,“privateKey”中加载的字节和设置的整数是相同的。
在 .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
...