Для расшифровки ответа в формате 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