Ошибка: "Метод шифрования не поддерживается этой версией протокола"

Я пытаюсь использовать интеграцию форм Sage Pay с моим сайтом. Я думал, что это будет довольно просто, но это не так далеко. Я работаю в.NET, поэтому я скачал.NET Integration Kit со страницы их поддержки, надеясь, что смогу увидеть, как он работает, и воспроизвести его.

К сожалению, примеры наборов слишком сложны для того, что они есть. Это должны быть чрезвычайно простые проекты, которые позволяют четко понять работу, а не завершенные, хорошо инкапсулированные решения. Это очень сложно, когда в одном файле кода есть методы, которые вызывают методы нескольких других, которые используют значения, хранящиеся в файле Web.Config... В целях обучения было бы намного проще, если бы код был напечатан долго - вручную в одном файле, со значениями настроек, явно объявленными. Конечно, это было бы не красиво, и, надеюсь, ни один достойный разработчик не повторил бы такой неуклюжий подход, но он бы облегчил понимание того, что происходит!

Во всяком случае, разглагольствовать. Моя проблема в том, что когда я отправляю свои данные в Sage Pay, я получаю сообщение об ошибке

"5068: The encryption method is not supported by this protocol version"

Чтобы выполнить шифрование, я добавил файл SagePay.IntegrationKit.DotNet.DLL в свой проект, а затем вызвал SagePay.IntegrationKit.Cryptography.EncryptAndEncode метод, который создает зашифрованную строку, которая выглядит так же, как та, что была создана в рабочем примере с веб-сайта. К сожалению, когда я отправляю строку на сервер Sage Pay, я получаю указанную ошибку.

2 ответа

Решение

Я не голосовал против, но в вашем вопросе (например, источнике) не так много вопросов, которые могут это объяснить. Однако я только что работал с этим кодом для шифрования:

public string SagePayEncryptAndEncode(string inputText, string key)
{
    using (var AES = new RijndaelManaged())
    {

        // Set the mode, padding and block size for the key
        AES.Padding = PaddingMode.PKCS7;
        AES.Mode = CipherMode.CBC;
        AES.KeySize = 128;
        AES.BlockSize = 128;

        // Convert key and input text into byte arrays
        Byte[] keyAndIvBytes = UTF8Encoding.UTF8.GetBytes(key);
        Byte[] inputBytes = UTF8Encoding.UTF8.GetBytes(inputText);

        // Create streams and encryptor object
        using (var memoryStream = new MemoryStream())
        using (var cryptoStream = new CryptoStream(memoryStream, AES.CreateEncryptor(keyAndIvBytes, keyAndIvBytes), CryptoStreamMode.Write))
        {

            // Perform encryption
            cryptoStream.Write(inputBytes, 0, inputBytes.Length);
            cryptoStream.FlushFinalBlock();

            // Get encrypted stream into byte array
            var outBytes = memoryStream.ToArray();

            // Manually close streams
            memoryStream.Close();
            cryptoStream.Close();
            AES.Clear();

            //return Convert.ToBase64String(outBytes);

            return BitConverter.ToString(outBytes).Replace("-", String.Empty);
        }
    }
}

Затем вам нужно сохранить полученное значение в скрытом поле "Склеп" и добавить "@".

<input name='Crypt' type='hidden' value='@<InsertResultHere>' />

Следует отметить, что он работает только с использованием Hex-кодирования, а не Base64-кодирования, как следует из документации.

Надеюсь это поможет!

Форма v3.00 Зашифрованная строка должна быть зашифрована с использованием алгоритма AES/CBC/PCKS#5 и предварительно зарегистрированного пароля шифрования (он отличается как для тестовой, так и для действительной учетных записей), затем впоследствии кодируется Base64, чтобы обеспечить безопасную передачу в форме HTML. Пожалуйста, используйте AES, как указано выше, чтобы избежать ошибки 5068.

V2.23 также поддерживает XOR.

Поддержка Sage Pay

Другие вопросы по тегам