2010-01-22 7 views
2

J'essaie de stocker des informations (courtes) enchaînées dans un cookie. Je génère une chaîne courte (environ 64 caractères), générant la clé en utilisant generateSecretKey(), et en essayant le cryptage AES ou Blowfish.Problèmes de cryptage

J'ai essayé les UUEncoding, Base64 et Hex par défaut en utilisant les paramètres des fonctions encodage() et decode().

Avec AES, je reçois l'erreur

Une erreur est survenue en essayant de chiffrer ou déchiffrer votre chaîne d'entrée: com.rsa.jsafe.crypto.dr: Impossible d'effectuer unpadding: octet non valide .. pad

Avec Blowfish, je reçois l'erreur

Une erreur est survenue en essayant de chiffrer ou déchiffrer votre chaîne d'entrée: bloc donné finale pas correctement rembourré.

Qu'est-ce que je fais mal?

+0

Quelle version/édition de ColdFusion? –

+0

Pourriez-vous fournir un exemple simple qui illustre le problème? – Leigh

+0

oui, pls poster le code cfml que vous avez utilisé. – Henry

Répondre

0

En raison des contraintes de temps, nous avons fini utilisant le cryptage cfmx_copat. Je m'excuse auprès des deux personnes qui ont répondu, car je n'ai jamais été en mesure d'expérimenter leurs réponses aussi complètement que je l'aurais souhaité.

4

Blowfish a une taille de bloc de 64 bits, soit 8 octets. AES a une taille de bloc de 128 bits, soit 16 octets.

La taille du bloc implique qu'il ne peut faire que des blocs de cette taille. Donc quelque chose avec une taille de bloc de 8 octets ne peut pas faire 7,6,5,4,3,2,1 octets.

Si vous avez moins de nombre de bits e ou octets requis (8 et 16 octets ici), vous devez pad ceux qui ont quelque chose à arriver à un long bloc 8/16 d'octets. (Padding en anglais signifie que vous devez ajouter des bits/octets inutilisés - parfois du contenu prescrit par le protocole/l'algorithme, parfois le contenu n'a pas d'importance) jusqu'à ce que vous ayez quelque chose de la taille requise.)

à propos de mauvais rembourrage. Donc, mon intuition est que vous ne passez pas la bonne taille (longueur) des données aux algorithmes de chiffrement/déchiffrement. Consultez la documentation pour voir si elles acceptent comme données d'entrée:

  • exactement un bloc (8 ou 16 octets ici)
  • un multiple exact de la taille du bloc (= dans ce cas, vous devrez faire le rembourrage)
  • une taille arbitraire de données (= vous ne devez pas faire padding - mais alors pourquoi avez-vous eu l'erreur pour commencer)

Toute chance que vous avez accidentellement fait votre UU/base64/Hex codant avant l'étape de chiffrement?

Vous devez:

  • faire le cryptage premier,
  • alors le UU/base64/Hex encodage,
  • puis d'envoyer les données sur.

De toute évidence, la séquence inverse lors de la réception des données:

  • premier décodage UU/base64/Hex,
  • décrypter ensuite,
  • utiliser ensuite les données.
+0

Je ne m'étais pas encodé. J'utilisais l'option intégrée dans les fonctions encode()/decode(). –

+0

Désolé, manque de connaissance approfondie de l'environnement, je ne sais pas plus loin. J'ai trouvé ce fil cependant, peut-être que ça aide: http://forums.sun.com/thread.jspa?threadID=607193 –

1

Je ne suis pas sûr de la version que vous utilisez, mais cela semble fonctionner très bien avec CF9, OpenBD et Railo (en utilisant AES ou Blowfish)

<!--- create an encrypted cookie ---> 
<cfset text = "testing, 1, 2, 3" > 
<cfset key = generateSecretKey("AES")> 
<cfset encrypted = encrypt(text, key, "AES", "hex")> 
<cfcookie name="secretValue" value="#encrypted#"> 

<!--- display test values used---> 
<form method="post"> 
    DEBUG:<hr /> 
    <cfoutput> 
    Text: #text#<br /> 
    Key: #key#<br /> 
    Encrypted: #encrypted# <br /> 

    <input type="hidden" name="text" value="#text#"> 
    <input type="hidden" name="key" value="#key#"> 
    <input type="submit" value="Decrypt Cookie"> 
    </cfoutput> 
</form> 

<!--- decrypt test values ---> 
<cfif structKeyExists(FORM, "key") AND structKeyExists(COOKIE, "secretValue")> 
    <cfset decrypted = decrypt(cookie.secretValue, key, "AES", "hex") > 
    <cfoutput> 
     form.text = #text# <br /> 
     form.key = #key# <br /> 
     cookie.secretValue = #cookie.secretValue# <br /> 
     decrypted = #decrypted# <br /> 
    </cfoutput> 
</cfif>