1

我有一个字符串(由用户 ID 和日期/时间戳组成),然后我使用 ColdFusion 的Encrypt(inputString, myKey, "Blowfish/ECB/PKCS5Padding", "Hex") 对其进行加密。

为了与 3d 派对交互,我必须执行以下操作:

  1. 将结果字符串中的每个字符对转换为 HEX 值。
  2. 然后将 HEX 值表示为整数。
  3. 然后将结果整数作为 ASCII 字符输出。
  4. 所有的 ASCII 字符组合起来形成一个字节串。
  5. 然后将字节串转换为 Base64。
  6. Base64 是 URL 编码并最终发送出去(呸!)

当原始 cfEncrypted 字符串包含“00”时,这一切都可以无缝运行。

十六进制值 00 转换为整数(通过函数 InputBaseN) 0 然后拒绝正确转换为 ASCII 字符!

生成的 Bytestring(以及因此的 url 字符串)被弄乱了,3d 方无法破译它。

值得一提的是,我确实在页面顶部声明了:<cfcontent type="text/html; charset=iso-8859-1">。

有什么方法可以正确地将 00 输出为 ASCII 吗?我可以避免在原始加密字符串中包含“00”吗?任何帮助将不胜感激 :)

4

2 回答 2

0

实际上有一个非常简单的解决方案。正在处理您的请求的信用卡公司需要您将其转换为十六进制小写字母。唯一处理的字符是 :,-,0-9 执行 if else 并将它们手动转换为字符串。

于 2013-03-17T16:59:51.210 回答
0

我很确定 ColdFusion(以及下面的 Java)使用以空字符结尾的字符串类型。这意味着每个字符串都包含一个且只有一个 asc(0) 字符,它是字符串终止符。如果您尝试将 asc(0) 插入字符串,CF 会出错,因为您尝试创建格式错误的字符串元素。

我不确定最终的解决方案是什么。我会使用 toBinary() 和 toString(),并与您的第 3 方供应商讨论解决方法,例如发送原始十六进制值或类似内容。

于 2010-10-25T13:00:57.583 回答