2010-10-25 28 views
1

Je dispose d'une chaîne (composée d'un ID utilisateur et d'un horodatage) que je crypte ensuite à l'aide de Encrypt de ColdFusion (inputString, myKey, "Blowfish/ECB/PKCS5Padding "," Hex ").ColdFusion: Entier "0" ne convertit pas en caractère ASCII

Pour l'interface avec une partie 3d je dois alors effectuer les opérations suivantes:

  1. Convertir chaque paire de caractères dans la chaîne résultant en une valeur HEX.
  2. Les valeurs HEX sont alors représentées comme des entiers.
  3. Les entiers résultants sont ensuite affichés en tant que caractères ASCII.
  4. Tous les caractères ASCII se combinent pour former un Bytestring. Bytestring est ensuite converti en Base64.
  5. base64 est URL codé et finalement expulsé (ouf!)

Tout fonctionne de manière transparente, sauf lorsque la chaîne cfEncrypted d'origine contient un « 00 ».

La valeur HEX 00 se traduit par l'entier (via la fonction InputBaseN) 0 qui refuse alors de se traduire correctement en caractère ASCII!

La chaîne d'octets résultante (et donc la chaîne d'URL) est foirée et la partie 3d est incapable de la déchiffrer.

Il convient de mentionner que je déclare: < type cfcontent = "text/html; charset = iso-8859-1" > en haut de la page.

Existe-t-il un moyen de sortir correctement 00 comme ASCII? Pourrais-je éviter d'avoir "00" dans la chaîne cryptée d'origine? Toute aide serait grandement appréciée :)

+1

Pouvez-vous fournir un petit test, y compris les résultats réels par rapport aux résultats attendus? (Aussi, je ne suis pas sûr pourquoi vous avez besoin de l'étape 1 si votre encrypt() retourne "hex" ..) – Leigh

Répondre

0

Je suis assez sûr que ColdFusion (et Java ci-dessous) utilise un type de chaîne à terminaison nulle. Cela signifie que chaque chaîne contient un et un seul asc (0) char, qui est le terminateur de chaîne. Si vous essayez d'insérer un asc (0) dans une chaîne, CF provoque une erreur car vous essayez de créer un élément de chaîne mal formé.

Je ne suis pas sûr de la solution finale. Je voudrais jouer avec toBinary() et toString(), et parlez à votre fournisseur tiers sur les solutions de contournement comme l'envoi des valeurs hexadécimales brutes ou similaires.

+0

La seule façon que j'ai trouvé pour créer un vrai caractère nul est URLDecode ("% 00) http: // www .coldfusiondeveloper.com.au/go/note/2007/05/06/null-character/ – Leigh

+0

.. Bien que je ne sois pas sûr que ce soit même le problème ici – Leigh

+0

Merci pour les conseils des gars, j'ai fini par contourner le problème (grâce à un pointeur de Leigh) en ignorant tout le processus manual-hex-decimal-base64 En utilisant Encrypt (inputString, myKey, "Blowfish/ECB/PKCS5Padding", "Base64") directement à partir de l'offset, CF a fait le dur travail pour moi (d'oh!). –

0

En fait, il existe une solution très simple. La société de carte de crédit qui traite votre demande a besoin que vous la convertissiez en lettres minuscules d'hex. Les seuls caractères traités sont:, -, 0-9 font un sinon et les convertissent manuellement en une chaîne.