错误:“此协议版本不支持加密方法”

时间:2013-11-11 12:26:41

标签: asp.net vb.net sagepay

我正在尝试使用Sage Pay的表格集成我的网站。我认为它相当简单,但事实并非如此。我在.NET工作,所以我从他们的支持页面下载了.NET Integration Kit,希望我能够看到它是如何工作的并复制它。

不幸的是,示例套件太复杂了。它们应该是非常简单的项目,它们可以清楚地理解工作,而不是完整的,封装良好的解决方案。当一个代码文件中的方法调用来自其他几个使用存储在Web.Config文件中的值的方法时,这是非常复杂的......出于教育的目的,如果代码被长输出则会更容易-hand在一个文件中,显式声明设置值。当然它不会很漂亮,希望没有像样的开发人员可以复制这种笨拙的方法,但它会让你更容易看到发生了什么!

无论如何,咆哮。我的问题是,当我将数据提交给Sage Pay时,我收到了错误

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

要进行加密,我将SagePay.IntegrationKit.DotNet.DLL文件添加到我的项目中,然后调用SagePay.IntegrationKit.Cryptography.EncryptAndEncode方法,该方法生成一个加密字符串,该字符串与工作示例中生成的字符串相同。网站。不幸的是,当我将字符串提交给Sage Pay的服务器时,我得到了错误。

2 个答案:

答案 0 :(得分:4)

我没有投票,但你的问题(例如来源)中没有太多可以解释它。但是,我刚刚使用此代码进行加密:

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>' />

有一点需要注意,它似乎只能使用十六进制编码,而不是文档所暗示的Base64编码。

希望这有帮助!

答案 1 :(得分:2)

表格v3.00加密字符串应使用AES / CBC / PCKS#5算法和预先注册的加密密码加密(它对于Test和Live帐户都不同),然后进行Base64编码以允许安全传输HTML表单。请确保使用上述AES来防止错误5068。

V2.23也支持XOR。

Sage Pay支持