使用ColdFusion加密为Sagepay形式进行加密



我正在尝试使用ColdFusion 10。

在SagePay 3.00中遵循一个规范。

要求是将字符串作为AES(块大小128位)在CBC模式下使用PKCS#5填充使用提供的密码作为密钥和初始化向量,并在十六进制中对结果进行编码。

是导致问题的"使用提供的密码"。

目前我有

myStr = 'assortednamevaluepairsetc';
providedPassword = 'abcdefghijklmnop';
myCrypt = Encrypt(myStr,providedPassword,'AES/CBC/PKCS5Padding','HEX',providedPassword,1);

但这是行不通的,因为SagePay给出的值会导致错误 - "指定的密钥不是此加密的有效关键:无效的AES密钥长度"是其仅16个字符长

根据CF文档,您需要使用GenerateSecretkey保证AES的关键长度,因此我尝试了此功能,但是尽管它给出了结果,但就加密而言,它不是正确的结果

myStr = 'assortednamevaluepairsetc';
providedPassword = 'abcdefghijklmnop';
mySecret = GenerateSecretKey('AES');
myCrypt = Encrypt(myStr,mySecret,'AES/CBC/PKCS5Padding','HEX',providedPassword,1);

对此感激地收到的任何帮助。

使用生成eCretkey 保证AES的关键长度

仅当您需要生成一个完全 new 加密密钥时,才使用该功能。你已经有一个了。generateSecretKey的主要目的是确保您生成一个强大的加密密钥,这是足够随机的。

无法使用 错误 - "指定的密钥不是此加密的有效键:无效 AES密钥长度"作为16个字符长

AES的关键长度为16 bytes (即128位)。问题是Gentprypt()期望"键"是一个base64编码的字符串,该字符串比普通字符串长约33%。当您调用加密(..)时,CF将提供的"键"字符串解码为字节,即实质上是这样做的:

  <cfset keyBytes = binaryDecode(yourPassword, "base64")>
  <cfoutput>length = #arrayLen(keyBytes)# bytes</cfoutput>

由于您的密码字符串不是base64编码,因此所产生的密钥长度太小,即(12)而不是(16)字节。因此,错误消息。

解决方案是首先对基础64进行编码。您如何做到这取决于字符串的编码。听起来它只是一个纯文本字符串(希望是一个足够随机的字符串...)。如果是这样,请使用CharSetDecode从相关的charset(IE UTF-8等)中解码字符串,然后将其二进制于base64:

  <cfset keyIVBytes = charsetDecode(yourKeyString, "utf-8")>
  <cfset base64Key = binaryEncode(keyIVBytes, "base64")>

另外,iv参数应为二进制。由于 keyiv是相同的一个,因此只需使用上一个步骤中的字节数组即可。另外,删除iterations参数,因为它不应用。通过这些更改,它应该按预期工作:

 encrypt(myStr, base64Key,"AES/CBC/PKCS5Padding", "hex", keyIVBytes)

nb:我不是加密专家,但是...使用密钥作为iv不是一个好主意...可能想与他们联系以查看是否还有其他选项。

最新更新