У меня есть идентичный код, который компилируется и запускается под 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). Загружены одни и те же байты закрытого ключа, тот же путь кода (по крайней мере, что касается С#) - такое же исключение «плохих данных» только в Windows. Вот ключ:
P: 17801190547854226652823756245015999014523215636912067427327445031444286578873
70207706126952521234630795671567847784664499706507709207278570500096683881440341
29745221171818506047231150039301079959358067395348717066319802262019714966524135
060945913707594956514672855690606794135837542707371727429551343320695239
Q: 864205495604807476120572616017955259175325408501
G: 17406820753240209518581198012352343653860449079456135097849583104059995348845
58231478515974089409507253077970949157594923683005742524387610370844734671801488
76118103083043754985190983472601550494691329488083395492313850000361646482644608
492304078721818959999056496097769368017749273708962006689187956744210730
X: 3505625379966178555918512548923624458026758122
...
Seed
может привести к ошибке Bad Data, но я ожидаю, что и с моно. Может помочь дополнительная информация: (1) Как вы генерируете закрытый ключ (например, в том или ином .NET или моноDSACryptoServiceProvider
)? (2) Можете ли вы предоставить еще немного кода (например, для загрузкиDSAParameters
, возможно, проблема в нем). (3) Вы говорите, что подписи .NET всегда недействительны, как вы их проверяете? - person softwariness   schedule 13.03.2015DSACryptoServiceProvider
, а не в загрузке параметров из файла (т.е. байты идентичны вImportParameters
, но по-разному интерпретируются этим методом), но, вероятно, это не так. не то. Re .NET ограничивает значения, это возможно, или это может быть ошибка. Можете ли вы предоставить шестнадцатеричный или base64 некоторые примеры параметров, которые не могут быть импортированы в .NET, чтобы я мог попытаться воспроизвести их? - person softwariness   schedule 13.03.2015