【问题标题】:Encrypting Crypt field using Classic ASP for SagePay Form Integration使用经典 ASP 为 SagePay 表单集成加密 Crypt 字段
【发布时间】:2014-07-29 21:29:48
【问题描述】:

发布此表单时,我总是收到相同的错误 3045:缺少货币字段:

<form name="frmPay" action="https://test.sagepay.com/gateway/service/vspform-register.vsp" method="POST">
<input type="text" name="VPSProtocol" value="3.00" />
<input type="text" name="TxType" value="PAYMENT" />
<input type="text" name="Vendor" value="myvendor" />    
Crypt:<textarea rows="10" cols="200" name="Crypt"><%=Crypt%></textarea>
<input type="submit" value="Send" />
</form>

我认为错误在于加密

有人可以发送经典 ASP 的加密例程吗?

【问题讨论】:

  • 这个question 也抱怨货币字段,可能值得一看它是用于 PHP 但可能有助于追查问题。

标签: forms asp-classic aes encryption-symmetric opayo


【解决方案1】:

更新(2014 年 11 月 19 日):通过another question 发现了一个关于此主题的有用链接。

https://www.sagepaylabs.com/AES.zip

该文件包含如何使用 AES Rijndael 分组密码的修改版本来实现 AES(128 位)的经典 ASP 示例,该密码最初由 Phil Fresle (2001) 编写,但已由 Sage Pay 的 Mat Peck 修改以运行具有 CBC 和 PKCS#5 填充的 128 位块 (AES)。

Classic ASP 示例包含两个文件

包括.asp rijndael.asp

Sage Pay Form 集成要求非常具体。

来自Form integration protocol and guidelines

A1.1 地穴领域

  1. Crypt 字段应包含所有其他交易信息(请参阅下一部分),以纯文本形式作为 Name=Value 字段 用“&”字符分隔。确保所有必填字段都存在,并且“&”字符后没有空格。

  2. 然后应使用 CBC 模式下的 AES(块大小 128 位)加密此字符串,并使用提供的 PKCS#5 填充 密码作为密钥和初始化向量,并将结果编码为十六进制(确保字母为大写)。

  3. @ 符号添加到编码结果的开头。

注意:要在解密模式下使用相同的程序进行解密,请确保在这样做之前删除@ 符号。


地穴字段示例

使用密钥55a51621a6648525
为了加密下面的请求,我们应该得到下面的加密结果

键值对

VendorTxCode=TxCode-1310917599-223087284&Amount=36.95&Currency=GBP
&Description=description&CustomerName=FnameSurname
&CustomerEMail=customer@example.com&BillingSurname=Surname
&BillingFirstnames=Fname&BillingAddress1=BillAddress Line 1
&BillingCity=BillCity&BillingPostCode=W1A 1BL
&BillingCountry=GB&BillingPhone=447933000000&DeliveryFirstnames=Fname
&DeliverySurname=Surname&DeliveryAddress1=BillAddress Line 1
&DeliveryCity=BillCity&DeliveryPostCode=W1A 1BL
&DeliveryCountry=GB&DeliveryPhone=447933000000
&SuccessURL=https://example.com/success&FailureURL=https://example.co/failure

加密结果

@2DCD27338114D4C39A14A855702FBAB2EF40BCAC2D76A3ABC0F660A07E9C1C921C2C755BA9B59C39F882FBF6DFED114F23141D94E50A01A665B1E3
1A86C07CA1CD1BB8EF5B6CF2C23D495CD79F9C0F678D61773E7A1AA30AA5B23D56503FC0B52AC0694A8C341263D2C5FE1BAD93BDB94726761E155E9
00448F644AF1F67BE1AC77E852B9D90809A44F258EE9478B6D8C1C4ED58759263E7DBF8871C6592287C0358F36F4EEC326CEDDD440DA2FED8AB35F1B
630A5C6FA671E4D78CC8CACECF9DFDC31D6C5EC8270FB21E297E2C2E14F99A04223EFFD4F00062D440E78A3D2C7140EC8F123D247B75E7482AE98858
DA34D37EDE6D7C69AA74391F559305CF675ADB3615244A107ABBB6AF26E29A2FFA059B12688D90FE09E0DE069325BFF3587A695F5DA36E4B809B69C
C9A37034F166B63B5A62B986F4DA34E9AC9516AFDE70642EC7DAD1AEBA93A1F347D6AC7046E967DCBFE7ACFCEE5DAFC0B29F1765032B3060EBE565C
BD57D092075D15CF12725199C6881605B2E0F105698CE3ADD04361CA9D620C187B90E3F9849445B5C3C0FDF1768BFFD61F97E51316826F4F10E0E3E6
68F0A9F5ED9CCDA6F2C7CC957F12DB48F9041482E3D035E7A91852C404BFA325FED947E71F57B871DFAC6AF4FF29F4513A4A80B2D7ECC9D19D47ED04
FA99CDFC881DFA771E1EA4F3F9B2C5AC673EF3DA2699A309CC8522993A63CB8D45D3CDF09B1DFDC573CD19679B250AD6721450B5042F201670B4645
05DCAEF59E2C67ABACC9AE2EEE793CE191FEBF66B8FAF4204EFFB359246B9C99FB52805C46375FF35140F74707FBC73C7731A28A2C883A

考虑到这些要求意味着您在经典 ASP 环境中可用的选项受到限制。

我建议使用AspEncrypt by Persit Software 或我能找到的唯一其他有希望的选项是(Classic ASP) AES Encryption,但由于我没有使用这些组件中的任何一个,我无法保证它们的好坏。


但是,我之前在使用 Classic ASP 进行 Web 开发期间使用过 Persit 组件,并且可以说它们一直对我有用,所以我的建议是看看你的想法。

它似乎确实支持所需的要求,这里有一个示例 based on code from the documentation 被操纵以适应。

<%
Dim CM, Context, Key, Blob, Crypt

Set CM = Server.CreateObject("Persits.CryptoManager")
'AES requires the Microsoft Enhanced RSA and AES Cryptographic Provider.
'Set Context = CM.OpenContext("", True )
Set Context = CM.OpenContextEx( _
  "Microsoft Enhanced RSA and AES Cryptographic Provider", "", True _
)
Set Blob = CM.CreateBlob
Blob.Hex = "Hex Encoded Key given to you by Sage Pay" 'AES-128 Bit Key
'Might need to reverse the bytes which is why the third parameter is set to True.
Set Key = Context.ImportRawKey(Blob, calgAES128, True)

'Make sure padding is set to PKCS#5 and Cipher Mode is set to CBC
'these don't actually need defining because they are the defaults
'according to the documentation, just here for completeness.
Key.Padding = ccpPKCS5
Key.Mode = ccmCBC
Set Blob = Key.EncryptText("your key value pairs")

'Format encrypted field as required by Sage Pay
Crypt = "@" + Blob.Hex
%>

有用的链接

【讨论】:

  • 嗨 Lankymart,感谢您的帮助,我在这一行中有此错误“指定的类型无效。” Set Key = Context.ImportRawKey(Blob, calgAES128) 你能帮帮我吗?
  • @user3889418 假设它是calgAES128 常量值没有被当前的加密服务提供者识别,那么有一个关于它们的部分here。因为您想使用AES,您可能会受到需要支持Microsoft Enhanced RSA and AES Cryptographic Provider (Windows Server 2003 或更高版本) 的操作系统支持的限制。您可能需要将Set Context 行更改为Set Context = CM.OpenContextEx("Microsoft Enhanced RSA and AES Cryptographic Provider", "", True)
  • 这是正确的吗? TextToEncrypt = "VendorTxCode=........" Set CM = Server.CreateObject("Persits.CryptoManager") Set Context = CM.OpenContextEx("Microsoft Enhanced RSA and AES Cryptographic Provider", "", True) Set Blob = CM.CreateBlob Blob.Hex = "55a51621a6648525" 设置密钥 = Context.ImportRawKey(Blob, calgAES128) Key.Padding = ccpPKCS5 Key.Mode = ccmCBC 设置 Blob = Key.EncryptText(TextToEncrypt) Crypt = "@" + Blob。十六进制我有这个错误“指定的标志无效”。在 Set Key = Context.ImportRawKey(Blob, calgAES128) 行中
  • 也许这会有所帮助? Article PS01032928 - Invalid algorithm specified / Invalid flags specified。我提供的代码是从文档中的 sn-ps 伪编码以符合要求,因此未经测试,这只是尝试解决我担心的问题的问题。如果您在第 3 步的常量值方面遇到问题。建议将 TypeLib 引用添加到您的页面,我个人会更进一步,建议您将其添加到 global.asa 文件的顶部,以便在整个应用程序中使用它。跨度>
  • @user3889418 在查看支持文章时,注意到他们正在使用Set Key = Context.ImportRawKey(Blob, calgAES128, True) 第三个参数集,我们正在反转字节(默认值为 False)。
猜你喜欢
  • 2016-12-31
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多