2016-04-25 5 views
0

Betrachten Sie die folgende Methode, die Blowfish-Verschlüsselung ausführt:Warum werden Schrägstriche bei der Blowfish-Verschlüsselung entfernt?

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; 
} 

Der String, die ich zu kodieren wollen enthält zukunfts zerschneidet. Wenn ich versuche, zum Beispiel "http://www.google.com/Foo" zu codieren, werden die Vorwärtsschlitze aus irgendeinem Grund, wenn ich sie decodiere, z. "http: www.google.comFoo".

Was könnte eine mögliche Ursache dafür sein und wie könnte dies verhindert werden?

+1

Sie haben Ihren Verschlüsselungscode veröffentlicht, aber Ihre Beschwerde scheint in Ihrem Entschlüsselungscode enthalten zu sein. –

+0

Vielleicht habe ich mich nicht klar gemacht. Es gibt keinen Entschlüsselungscode, da ich meine Daten über HTTP verschlüsselt habe. Aus Gründen des Debuggens benutze ich diese Website, um meinen String zu entschlüsseln: https://webnet77.net/cgi-bin/helpers/blowfish.pl –

+0

Eine Bemerkung besser fügen Sie die Codierung zu: 'value.getBytes (StandardCharsets.UTF_8)' und bei der Entschlüsselung 'new String (Bytes, StandardCharsets.UTF: _8)'. Slash (und Plus) sind Teil von Standard Base64. Es gibt eine URL-sichere Base64-Variante, die andere Zeichen verwendet. Ich kann mir nicht vorstellen, wie, aber vielleicht wurde dieser Base64 auf _one_ Seite verwendet. –

Antwort

1

Es ist ein Fehler der Website (https://webnet77.net/cgi-bin/helpers/blowfish.pl), die Sie verwenden, um den verschlüsselten Text zu überprüfen.

Versuchen Sie, den Text (http://www.google.com/Foo) auf dieser Website zu verschlüsseln, und Sie werden sehen, dass es die Schrägstriche streift. Java nicht.


Weitere Themen:

  • Was ist der Wert des Parameters key?

    Wenn es sich um eine Hexadezimalcodierung des Blowfish-Schlüssels handelt, ist getBytes() völlig falsch, da Sie es hexadezimal dekodieren müssen, anstatt die Codepage-Konvertierung, die Sie gerade durchführen.

    SecretKeySpec benötigt eine byte[], da ein Schlüssel ein binärer Wert ist und kein Klartext gespeichert werden kann.

  • Blowfish/ECB/PKCS#5 ist keine gültige Chiffre in JDK.

    Blowfish/ECB/PKCS5PADDING ist.

  • Wenn Ihr value-Parameter jemals etwas anderes als reines ASCII enthalten kann, ist value.getBytes() nicht ausreichend. Sie sollten immer die Codepage beim Konvertieren einer Zeichenfolge in Bytes angeben.

    Sie können "US-ASCII" angeben, um nur ASCII zu erzwingen, oder geben Sie die vom Server benötigte Codepage an, aber "UTF-8" ist im Allgemeinen eine gute Wahl.

+0

Obwohl das Problem DID mit meinem Algorithmus existiert, haben mir Ihre Kommentare geholfen, es zu beheben. Insbesondere der Wechsel zu UTF-8-Kodierung und zu Blowfish/ECB/PKCS5PADDING haben es geschafft. –

Verwandte Themen