我需要与需要使用 Blowfish 和 Base64 对请求进行编码的 API 进行通信。
在我的自定义库中,我从以下内容开始:
# encoding: utf-8
require "base64"
require 'crypt/blowfish'
我创建一个实例:
@blowfish_key = '1234567887654321'
@blowfish = Crypt::Blowfish.new(@blowfish_key)
再往下,我创建了加密字符串(或 API 调用的“票证”)
@string_to_encrypt = "#{@partnerid},#{user.id},#{exam_id},#{return_url},#{time_stamp}"
@enc = @blowfish.encrypt_string(@string_to_encrypt)
在 Rails 控制台中,我可以@blowfish.decrypt_string(@enc)
毫无问题地解密。但是API给了我胡言乱语:
Invalid ticket:
Decrypted String :)IŠkó}*Ogû…xÃË-ÖÐHé%q‹×ÎmªÇjEê !©†xRðá=Ͳ [À}=»ïN)'sïƒJJ=:›õ)¦$ô1X¢
另外,当我在控制台中加密一些简单的东西时,比如“Hello”,并将加密的字符串提供给在线 Blowfish 解码器,比如http://webnet77.com/cgi-bin/helpers/blowfish.pl,我得到了同样的结果乱七八糟的回来。
就像 Ruby 河豚加密是一种在其他任何地方都不使用的格式。
笔记:
在我的实际应用程序中,我通过表单字段将加密字符串发送到 Web 服务。加密字符串采用 Base64 编码并以“a”为前缀。
@enc = Base64.encode64(@enc)
@enc = 'a' + CGI::escape(@enc)
这在他们的文档中进行了解释:
票据格式:
t=’a’ + URL_Encode (
Base64_Encode (
Blowfish_Encrypt ( ‘partnerid,user_id,test_id,URL_Encode(return_URL),ticket_timestamp’, ‘blowfish_key’)
)
)
请注意,Blowfish_Encrypt 函数接受两个参数 - 1)要加密的字符串和 2)十六进制密钥。另请注意,票的前缀是小写的“a”(ASCII 97)。
HTML 表单的外观示例:
<form method=”POST” action=”http://www.expertrating.com/partner_site_name/”>
<input type=”hidden” name=”t” value=”adfinoidfhdfnsdfnoihoweirhqwdnd2394yuhealsnkxc234rwef45324fvsdf2” />
<input type=”submit” name=”submit” value=”Proceed to take the Test” />
</form>
我迷路了,我哪里错了?