使用Classic ASP进行SagePay表单集成加密Crypt字段

时间:2014-07-29 21:29:49

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

我总是得到相同的错误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发送加密例程吗?

1 个答案:

答案 0 :(得分:3)

  

更新(2014年11月19日):有关该主题的another question有用的链接。

     

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

     

该文件包含如何使用AES Rijndael Block Cipher的修改版本实现AES(128位)的经典ASP示例,该版本最初由Phil Fresle(2001)编写,但已被Sage Pay的Mat Peck修改为与带有CBC和PKCS#5填充的128位块(AES)。

     

Classic ASP示例包含两个文件

  includes.asp
  rijndael.asp

Sage Pay Form Integration要求非常具体。

  

来自Form integration protocol and guidelines

     

A1.1地穴字段

     
      
  1. Crypt字段应包含纯文本中的所有其他事务信息(请参阅下一节)Name = Value字段   用'&amp;'字符分隔。确保所有必填字段都存在且“&amp;”字符后面没有空格。

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

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

  6.         

    注意:要解密,请在解密模式下使用相同的步骤,确保在执行此操作之前删除@符号。

         
         

    示例加密字段

         

    使用键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,但由于我没有使用这些组件中的任何一个,我无法保证它们有多好或多坏


但是我之前在使用经典ASP进行网页开发时使用过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
%>

有用的链接