2010-07-07 12 views
4

Je suis dans la position peu enviable où je dois maintenir des fonctionnalités avec une application ColdFusion existante. Dans le cadre de son processus de connexion, l'application Coldfusion stocke un cookie avec une chaîne cryptée.Déchiffrement/rechiffrement d'une chaîne cryptée ColdFusion dans PHP

encrypt(strToEncrypt, theKey, "AES", "Base64") 

Je peux déchiffrer avec succès cette chaîne en PHP en utilisant MCrypt et le code suivant

mcrypt_decrypt(
    MCRYPT_RIJNDAEL_128, 
    base64_decode($theKey), 
    base64_decode($encrypted_string), 
    MCRYPT_MODE_ECB, "0000000000000000") 

J'ai maintenant la nécessité d'effectuer le même cryptage au sein de PHP afin que l'application ColdFusion peut accéder aux données le cookie.

Au moment ce que j'ai est

mcrypt_encrypt(MCRYPT_RIJNDAEL_128, base64_decode($theKey), $strToEncrypt, MCRYPT_MODE_ECB, "0000000000000000"); 

Ceci, cependant, est incompatible avec l'algorithme de cryptage équivalent ColdFusion

decrypt(strToDecrypt, theKey, "AES", "Base64") 

Lancer une erreur Given final block not properly padded.

Toute aide très appréciée.

James

+1

Vous faites 'base64_encode()' le résultat de 'mcrypt_encrypt()'? – Tomalak

+0

Consultez également les paramètres ivorsalt et itérations pour la fonction de chiffrement: http://www.adobe.com/livedocs/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=ColdFusion_Documentation&file=00000457. htm –

+0

@Tomalak Oui, le résultat de mcrypt_encrypt est codé en base64. – WeeJames

Répondre

4

Je ne sais pas combien d'aide ce sera, mais j'ai eu le travail suivant. Je pense que pour faire CF heureux vous devez boucler votre cryptage à une certaine longueur

Crypter dans CF

Encrypt(data, encKey, 'AES/CBC/PKCS5Padding', encoding, encIv) 

Décrypter en PHP

function Decode($data, $encKey, $encIv, $format = 'uu') { 
    if ($format === 'uu') { 
     $data = Convert_uudecode($data); 
    } else if ($format === 'hex') { 
     $data = Pack('H*', $data); 
    } else if ($format === 'base64') { 
     $data = Base64_Decode($data); 
    } else if ($format === 'url') { 
     $data = UrlDecode($data); 
    } 
    $data = MCrypt_decrypt(MCRYPT_RIJNDAEL_128, $encKey, $data, 'cbc', $encIv); 
    $pad = Ord($data{strlen($data)-1}); 
    if ($pad > strlen($data)) return $data; 
    if (strspn($data, chr($pad), strlen($data) - $pad) != $pad) return $data; 
    return substr($data, 0, -1 * $pad); 
} 

Crypter en PHP

function Encode($data, $encKey, $encIv, $format = 'uu') { 
    $pad = 16 - (StrLen($data) % 16); 
    if ($pad > 0) { 
     $data .= Str_repeat(Chr($pad), $pad); 
    } 
    $data = MCrypt_encrypt(MCRYPT_RIJNDAEL_128, $encKey, $data, 'cbc', $encIv); 
    if ($format === 'uu') { 
     return Convert_uuencode($data); 
    } else if ($format === 'hex') { 
     return Bin2Hex($data); 
    } else if ($format === 'base64') { 
     return Base64_Encode($data); 
    } else if ($format === 'url') { 
     return UrlEncode($data); 
    } 
} 

Déchiffrer au CF

Decrypt(data, encKey, 'AES/CBC/PKCS5Padding', encoding, encIv) 

Pour une raison que je ne me souviens pas, j'ai préféré 'uu' pour l'encodage.

+0

Merci. Je ne suis pas en mesure de mettre à jour les FC pour le moment, mais je devrais être dans l'avenir, cela me sera utile. – WeeJames