2016-04-25 2 views
0

Tenir compte de la méthode suivante qui effectue le cryptage Blowfish:Pourquoi les barres obliques sont-elles dépouillées du cryptage Blowfish?

import javax.crypto.Cipher; 
import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 
import org.apache.commons.codec.binary.Hex; 

private static String encryptString(String value, String key) 
{ 
    String encryptedString = ""; 
    if (value != null) 
    { 
     SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "Blowfish"); 
     try 
     { 
      Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS#5"); 
      cipher.init(Cipher.ENCRYPT_MODE, keySpec); 
      byte[] encrypted = cipher.doFinal(value.getBytes()); 
      encryptedString = new String(Hex.encodeHex(encrypted)); 
     } 
     catch (Exception e) 
     { 
      // Show error 
     } 
    } 
    return encryptedString; 
} 

La chaîne que je veux encode contient des barres obliques avant. Lorsque j'essaie d'encoder par exemple "http://www.google.com/Foo", pour une raison quelconque lorsque je le décode, les barres obliques sont supprimées, par ex. "http: www.google.comFoo".

ce qui pourrait être une cause possible pour cela et comment cela pourrait-il être évité?

+1

Vous avez posté votre code de cryptage, mais votre plainte semble se trouver dans votre code de déchiffrement. –

+0

Peut-être que je ne me suis pas fait comprendre. Il n'y a pas de code de décryptage, car j'envoie mes données cryptées sur HTTP. Cependant pour des raisons de débogage, j'utilise ce site pour décrypter ma chaîne: https://webnet77.net/cgi-bin/helpers/blowfish.pl –

+0

Une remarque vaut mieux ajouter l'encodage à: 'value.getBytes (StandardCharsets.UTF_8)' et sur le déchiffrement 'new String (octets, StandardCharsets.UTF: _8)'. Slash (et plus) font partie de Base64 standard, Il existe une variante Base64 sûre d'URL qui utilise d'autres caractères. Je ne peux pas imaginer comment, mais peut-être que Base64 a été utilisé sur un côté. –

Répondre

1

C'est une erreur du site Web (https://webnet77.net/cgi-bin/helpers/blowfish.pl) que vous utilisez pour vérifier le texte crypté. Essayez de chiffrer le texte (http://www.google.com/Foo) sur ce site, et vous verrez qu'il supprime les barres obliques. Java ne le fait pas.


Autres questions:

  • Quelle est la valeur du paramètre key? S'il s'agit d'un codage hexadécimal de la clé Blowfish, alors getBytes() est totalement faux, car vous devez le décoder en hexadécimal, plutôt que la conversion de la page de codes que vous êtes en train de faire.

    SecretKeySpec nécessite une byte[] car une clé est une valeur binaire et ne peut pas être stockée en texte brut.

  • Blowfish/ECB/PKCS#5 n'est pas un chiffrement valide dans JDK.

    Blowfish/ECB/PKCS5PADDING est. Si votre paramètre value peut contenir autre chose que ASCII, alors value.getBytes() est insuffisant. Vous devez toujours spécifier la page de code lors de la conversion d'une chaîne en octets.

    Vous pouvez spécifier "US-ASCII" pour appliquer uniquement ASCII ou spécifier la page de codes requise par le serveur, mais "UTF-8" est généralement un bon choix.

+0

Bien que le problème existait avec mon algorithme, vos commentaires m'ont aidé à le résoudre. En particulier, le passage à l'encodage UTF-8 et à Blowfish/ECB/PKCS5PADDING a fait l'affaire. –