02.11.2018, 14:47 | #1 |
Участник
|
CryptoPro.Sharpei.Gost3410 и приватный ключ сертификата
Для расшифровки ответа в формате XML нам необходимо использовать приватный ключ, которым успешно зашифровали и отправили на сервер запрос. На C# эта реализация довольна простая и у нас получается расшифровать ответ:
Получаем закрытый ключ из сертификата и ложим его в AsymmetricAlgorithm, затем приводим AsymmetricAlgorithm к виду CryptoPro.Sharpei.Gost3410 и расшифровываем. Но наша ERP-система не умеет явно приводить к таким типам... На C# есть такой код и он работает: Код: private static SymmetricAlgorithm GetDecryptionKey(EncryptedXml exml, EncryptedData encryptedData) { IEnumerator encryptedKeyEnumerator = encryptedData.KeyInfo.GetEnumerator(); // Проходим по всем KeyInfo while (encryptedKeyEnumerator.MoveNext()) { // пропускам все что неизвестно. KeyInfoEncryptedKey current = encryptedKeyEnumerator.Current as KeyInfoEncryptedKey; if (current == null) continue; // до первого EncryptedKey EncryptedKey encryptedKey = current.EncryptedKey; if (encryptedKey == null) continue; KeyInfo keyinfo = encryptedKey.KeyInfo; // Проходим по всем KeyInfo зашифрования ключа. IEnumerator srcKeyEnumerator = keyinfo.GetEnumerator(); while (srcKeyEnumerator.MoveNext()) { // пропускам все что неизвестно. KeyInfoX509Data keyInfoCert = srcKeyEnumerator.Current as KeyInfoX509Data; if (keyInfoCert == null) continue; AsymmetricAlgorithm alg = SignatureIns().PrivateKey; // Приватный ключ, открытый ключ которого мы отправляли при шифровании запроса //MessageBox.Show(alg.ToXmlString(true)); Gost3410 myKey = alg as Gost3410; //MessageBox.Show(myKey.KeyExchangeAlgorithm); if (myKey == null) continue; return CPEncryptedXml.DecryptKeyClass(encryptedKey.CipherData.CipherValue, myKey, encryptedData.EncryptionMethod.KeyAlgorithm); } } return null; } .NET 3.5, Axapta, X++, Крипто Про 4 |
|
02.11.2018, 18:37 | #2 |
Участник
|
Так как приведения в DAX нет, то часто используется приведение через System.Object или CLRObject.
Сначала переменной вышеуказанного типа присваивается базовый тип, а потом наследнику присваивается эта переменная. Например: X++: System.Net.HttpWebRequest webRequest; System.Object sysObj; ..... sysObj = System.Net.WebRequest::Create(url); webRequest = sysObj; |
|