1

文字列 (ユーザー ID と日付/時刻スタンプで構成される) があり、ColdFusion のEncrypt(inputString, myKey, "Blowfish/ECB/PKCS5Padding", "Hex")を使用して暗号化します。

サード パーティとのインターフェイスを確立するには、次の手順を実行する必要があります。

  1. 結果の文字列内の各文字ペアを HEX 値に変換します。
  2. HEX 値は整数として表されます。
  3. 結果の整数は、ASCII 文字として出力されます。
  4. すべての ASCII 文字が結合してバイト文字列を形成します。
  5. その後、バイト文字列は Base64 に変換されます。
  6. Base64 は URL エンコードされ、最終的に送信されます (おお!)

元の cfEncrypted 文字列に「00」が含まれている場合は、すべてシームレスに動作します。

HEX 値 00 は、(関数 InputBaseN を介して) 整数 0 として変換され、ASCII 文字への正確な変換を拒否します!

結果の Bytestring (したがって、URL 文字列) はめちゃくちゃになり、サードパーティはそれを解読できません。

ページの上部に <cfcontent type="text/html; charset=iso-8859-1"> と宣言しています。

00 を ASCII として正しく出力する方法はありますか? 元の暗号化文字列に「00」が含まれないようにすることはできますか? どんな助けでも大歓迎です:)

4

2 に答える 2

0

ColdFusion (およびその下の Java) が null で終わる文字列型を使用していることは確かです。これは、すべての文字列に、文字列ターミネータである asc(0) 文字が 1 つだけ含まれていることを意味します。asc(0) を文字列に挿入しようとすると、不正な形式の文字列要素を作成しようとしているため、CF でエラーが発生します。

最終的な解決策が何であるかはわかりません。toBinary() と toString() をいじって、未加工の 16 進値などを送信するなどの回避策についてサードパーティ ベンダーに相談します。

于 2010-10-25T13:00:57.583 に答える
0

実はとても簡単な解決策があります。リクエストを処理しているクレジット カード会社は、リクエストを小文字の 16 進数に変換する必要があります。処理される文字は :,-,0-9 のみです。if else を実行し、手動で文字列に変換します。

于 2013-03-17T16:59:51.210 に答える