2010-07-20 29 views
4

Voici quelques exemples de code avec des valeurs clés modifiées et la charge utile:Mcrypt Blowfish php résultats légèrement différents par rapport à Java et .net

$key = '/4rTInjwg/H/nA=='; 
$key = base64_decode($key); 

$data = 'val=100|val=200|val=300|val=400|val=500|val=600|val=700|val=800|val=900|'; 
$data.= 'val2=100|val2=200|val2=300|val2=400|val2=500|val2=600|val2=700|val2=800|val2=900|'; 
$data.= 'val3=100|val3=200|val3=300|val3=400|val3=500|val3=600|val3=700|val3=800|val3=900|'; 
$data.= 'val4=100|val4=200|val4=300|val4=400|val4=500|val4=600|val4=700|val4=800|val4=900|'; 

$result = base64_encode(mcrypt_ecb(MCRYPT_BLOWFISH,$key, $data, MCRYPT_ENCRYPT)); 

Ce chiffre et déchiffre bien en PHP, mais Java et .NET venir avec des valeurs différentes, et ce qui est pire, je ne peux pas déchiffrer les résultats de Java ou .NET. Lorsque j'essaie de décrypter les valeurs de java, j'obtiens une chaîne qui commence bien, mais qui finit à mi-chemin. Je travaille en 5.3x sous Windows XP au cas où quelqu'un se le demanderait. Pendant que je STFW j'ai remarqué plusieurs threads où les derniers commentaires mentionnent des choses à propos de base64 gâcher le résultat en raison de problèmes de frappe, et je me demande si c'est ce qui se passe parce que les résultats sont si proches, les 50 premiers ou alors les caractères correspondent, alors les choses vont à @ # $ !.

J'ai également lu plusieurs discussions sur la taille et le rembourrage des blocs, mais personne ne semble être d'accord sur ce que le rembourrage devrait être. J'ai vraiment besoin de savoir si Java remballe le texte, quelle est la taille de bloc par défaut, quel serait le pad? Voir ci-dessous:

Le développeur java fait:

import org.apache.commons.codec.binary.Base64; 
    import java.util.ResourceBundle; 
    import com.sun.crypto.provider.SunJCE; 

    ... snip ... 

    StringBuffer ourTransferBuffer = new StringBuffer(s); 
    byte abyte0[] = Base64.decodeBase64(encryptionKey); 
    SunJCE sunjce = new SunJCE(); 
    Security.addProvider(sunjce); 
    SecretKeySpec secretkeyspec = new SecretKeySpec(abyte0, "Blowfish"); 
    Cipher cipher = Cipher.getInstance("Blowfish"); 
    cipher.init(1, secretkeyspec); 
    byte abyte1[] = cipher.doFinal(ourTransferBuffer.toString().getBytes()); 
    s = Base64.encodeBase64String(abyte1); 
    return s; 

    ... snip ... 

J'ai brûlé trop de temps déjà, quelqu'un a des idées ici? Merci.

Répondre

1

En résumé, un simple rembourrage pkcs5 a résolu le problème.

... snip ... 

$data = 'val=100|val=200|val=300|val=400|val=500|val=600|val=700|val=800|val=900|'; 
$data.= 'val2=100|val2=200|val2=300|val2=400|val2=500|val2=600|val2=700|val2=800|val2=900|'; 
$data.= 'val3=100|val3=200|val3=300|val3=400|val3=500|val3=600|val3=700|val3=800|val3=900|'; 
$data.= 'val4=100|val4=200|val4=300|val4=400|val4=500|val4=600|val4=700|val4=800|val4=900|'; 

$blocksize = mcrypt_get_block_size('blowfish', 'ecb'); // get block size 
$pkcs = $blocksize - (strlen($data) % $blocksize); // get pkcs5 pad length 
$data.= str_repeat(chr($pkcs), $pkcs); // append pkcs5 padding to the data 

// encrypt and encode 
$res = base64_encode(mcrypt_ecb(MCRYPT_BLOWFISH,$key, $data, MCRYPT_ENCRYPT));