Показать сообщение отдельно
Старый 02.11.2018, 14:47   #1  
jonny.do is offline
jonny.do
Участник
 
7 / 11 (1) +
Регистрация: 14.02.2018
? 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;
        }
Собственно вопрос, каким образом еще можно привести наш закрытый ключ к виду GOST3410
.NET 3.5, Axapta, X++, Крипто Про 4