2017-12-15 1 views
-2

Ich habe versucht, die JSON in JavaScript zu verschlüsseln, wie unten gezeigt, und es ist verschlüsselt. In unten "obj" ist meine JSON-Daten und ich weiß nicht, warum "ency_key", ich folgte dies von einigen wo in Google und sie String so weitergegeben.javax.crypto.BadPaddingException: Gegeben letzter Block nicht ordnungsgemäß gepolstert Ausnahme

var obj1 = CryptoJS.AES.encrypt(obj,'ency_key').toString(); 
$.ajax({ 
    url: "web/enyDcyData", 
    "type": "POST", 
    async:true, 
    data:{ 
     json:obj1, 
    } 

aber ich bin nicht in der Lage, die Daten in Java zu entschlüsseln, versuchte ich wie unten in Java. bekomme ich javax.crypto.BadPaddingException: Gegeben letzten Block nicht richtig aufgefüllt Ausnahme bei "doFinal (base64Decode (ency_data));" wo ich Fehler gemacht habe, bitte helfen Sie mir, dieses Problem zu lösen.

public static String decrypt(String ency_data) 
     SecretKeyFactory keyFac = SecretKeyFactory.getInstance(one); 
     SecretKey seckey = keyFac.generateSecret(new PBEKeySpec(two)); 
     Cipher cipher = Cipher.getInstance(one); 
     pbeCipher.init(Cipher.DECRYPT_MODE, seckey , new PBEParameterSpec(SALT, 20)); 
     byte[] res = cipher.doFinal(base64Decode(ency_data)); 
     String decryptedValue = new String(res,"UTF-8"); 
    } 

     private static byte[] base64Decode(String ency_data) throws IOException { 
      return new BASE64Decoder().decodeBuffer(ency_data); 
     } 
+1

_ "Ich habe verschiedene Möglichkeiten in Java versucht, bekomme aber einen anderen Fehler" _ Dann zeige sie (mindestens eine davon) – Andreas

+0

Aus deinen Kommentaren klingt es, als wüsstest du nicht, welcher Schlüssel auf der JavaScript-Seite verwendet wird Sie können also nicht einmal prüfen, ob Sie auf der Java-Seite denselben Schlüssel von 'keyFac.generateSecret()' bekommen. Ich denke, die Grundvoraussetzung dafür, eine Krypto-Frage zu SO zu stellen, wäre zu überprüfen, dass der Schlüssel, den Sie für die Verschlüsselung auf der JavaScript-Seite verwenden, derselbe Schlüssel ist, den Sie auf der Java-Seite zum Entschlüsseln verwenden. Ihre Ausgabe ist konsistent mit der Verwendung anderer Schlüssel (sowie vieler anderer Fehler) ... wenn Sie das nicht ausschließen können, können wir Ihnen nicht wirklich helfen. Wählt 'man' sogar AES? – lockcmpxchg8b

Antwort

1

Die Schlüsselableitungsfunktion, die Sie verwenden, ist anders. CryptoJS (Version 3) verwendet eine OpenSSL-kompatible Schlüsselableitungsfunktion, während Sie PBKDF1 verwenden (oder möglicherweise 2, Ihr Algorithmus ist nicht enthalten). Möglicherweise müssen Sie nach einer Implementierung von EVP_BytesToKey suchen, z. here. Oder Sie könnten natürlich nach einer vollständigen OpenSSL-Kompatibilitätsebene suchen.

Wenn sich der Schlüssel oder die Daten unterscheiden, sollten Sie einen Auffüllfehler für den CBC/ECB-Modus erwarten. Es ist der einzige Fehler, der ausgelöst werden kann, wenn die Datengröße ein Vielfaches der Blockgröße ist (und der Schlüssel/Algorithmus wurde während der Instanziierung/Initialisierung akzeptiert).

Verwandte Themen