【问题标题】:Error: "The encryption method is not supported by this protocol version"错误:“此协议版本不支持加密方法”
【发布时间】:2013-11-26 21:59:34
【问题描述】:

我正在尝试在我的网站中使用 Sage Pay 的表单集成。我认为这会相当简单,但到目前为止还没有证明。我在 .NET 中工作,所以我从他们的支持页面下载了 .NET 集成工具包,希望能够看到它是如何工作的并复制它。

不幸的是,示例套件太复杂了。它们应该是非常简单的项目,可以清楚地理解其工作原理,而不是完整的、封装良好的解决方案。当一个代码文件中有一些方法调用其他几个方法的方法时,这非常复杂- 提交一个文件,并明确声明设置值。当然它不会很漂亮,希望没有像样的开发人员会复制这种笨拙的方法,但它会更容易看到发生了什么!

不管怎样,吐槽吧。我的问题是,当我将数据提交给 Sage Pay 时出现错误

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

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

【问题讨论】:

  • 有什么线索可以说明为什么这被否决了吗?

标签: asp.net vb.net opayo


【解决方案1】:

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

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);
        }
    }
}

然后您需要将结果值存储在隐藏的“Crypt”字段中并在前面加上“@”。

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

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

希望这会有所帮助!

【讨论】:

  • 如果使用 V2.23 或 2.2,文档将是正确的,版本 3 不使用旧的加密方法。
  • 嗨,丹。感谢那。老实说,文档看起来确实很粗略。甚至不要让我开始了解错误代码的数量,这些错误代码基本上被记录为“出了点问题,请检查并修复它”......但是,如果它太容易了,我们就不能收取这么多的费用对于我想的工作。
【解决方案2】:

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

V2.23 也支持 XOR。

Sage 支付支持

【讨论】:

  • 这里的问题与 ASP 相关,但是这个页面在 google 中显示的错误信息很高,所以认为链接到一个 PHP 类对于新的 v3 @987654321 正确执行它可能会有所帮助@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
相关资源
最近更新 更多