要求を 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)
@blowfish.decrypt_string(@enc)
Rails コンソールでは、問題なく復号化できます。しかし、APIは意味不明です:
Invalid ticket:
Decrypted String :)IŠkó}*Ogû…xÃË-ÖÐHé%q‹×ÎmªÇjEê !©†xRðá=Ͳ [À}=»ïN)'sïƒJJ=:›õ)¦$ô1X¢
また、「Hello」などのコンソールで単純なものを暗号化し、暗号化された文字列をhttp://webnet77.com/cgi-bin/helpers/blowfish.plなどのオンライン Blowfish デコーダーにフィードすると、同じ結果が得られます。意味不明な混乱。
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) 16 進キーの 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>
道に迷ったのですが、どこが間違っていますか?