2017-05-08 2 views
0

Ich bin Newbee in Java und JS und versuchen, Passwort in Java zu verschlüsseln, die von meinem vorhandenen JS-Code entschlüsselt werden sollte. (Ich möchte mein JS nicht ändern!)Verschlüsseln in Java und Dycrypt in JavaScript mit Crypto JS funktioniert nicht

Ich denke, es hat etwas mit KEY und IV zu tun, was mir völlig unbekannt ist.

** Java-Programm **

public class Helper { 

public Cipher dcipher, ecipher; 

// Responsible for setting, initializing this object's encrypter and 
// decrypter Chipher instances 
public Helper(String passPhrase) { 

    // 8-bytes Salt 
    byte[] salt = {(byte) 0xA9, (byte) 0x9B, (byte) 0xC8, (byte) 0x32, (byte) 0x56, (byte) 0x34, (byte) 0xE3, (byte) 0x03}; 

    // Iteration count 
    int iterationCount = 19; 

    try { 
     // Generate a temporary key. In practice, you would save this key 
     // Encrypting with DES Using a Pass Phrase 
     KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount); 
     SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec); 

     ecipher = Cipher.getInstance(key.getAlgorithm()); 

     // Prepare the parameters to the cipthers 
     AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount); 
     ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);    

    } catch (InvalidAlgorithmParameterException e) { 
     System.out.println("EXCEPTION: InvalidAlgorithmParameterException"); 
    } catch (InvalidKeySpecException e) { 
     System.out.println("EXCEPTION: InvalidKeySpecException"); 
    } catch (NoSuchPaddingException e) { 
     System.out.println("EXCEPTION: NoSuchPaddingException"); 
    } catch (NoSuchAlgorithmException e) { 
     System.out.println("EXCEPTION: NoSuchAlgorithmException"); 
    } catch (InvalidKeyException e) { 
     System.out.println("EXCEPTION: InvalidKeyException"); 
    } 
} 

// Encrpt Password 
@SuppressWarnings("unused") 
public String encrypt(String str) { 
    try { 
     // Encode the string into bytes using utf-8 
     byte[] utf8 = str.getBytes("UTF8"); 
     System.out.println("\n UTF8 : " + utf8); 
     // Encrypt 
     byte[] enc = ecipher.doFinal(utf8); 
     System.out.println("\n enc: " + enc); 
     // Encode bytes to base64 to get a string 
     return new sun.misc.BASE64Encoder().encode(enc); 

    } catch (BadPaddingException e) { 
    } catch (IllegalBlockSizeException e) { 
    } catch (UnsupportedEncodingException e) { 
    } 
    return null; 
} 


public static void main(String[] args) { 
    try { 

     Helper encrypter = new Helper(""); 

     System.out.print("Enter a password : "); 
     String password = input.nextLine(); 

     String encrypted = encrypter.encrypt(password); 
     System.out.println("encrypted String:" + encrypted); 
    } catch (Exception e) { 
    } 

} 

}

Above Programm sollte Schlüssel verschlüsseln - die durch folgende JS entschlüsselt werden:

var encryptedpassword=this.bodyParams.password; 

     var bytes = CryptoJS.AES.decrypt(encryptedpassword.toString(), accKey); 
     var newpassword = bytes.toString(CryptoJS.enc.Utf8); 

WHERE accKey = "Nqnzu3RhCJ1h8ql5fdKOaKUAbsuURze ********* _

+1

9/10 mal diese Crypto-Probleme werden von JS Unicode-Strings verursacht und die anderen Jungs nicht-Unicode-Strings ... – dandavis

+0

Können Sie vorschlagen, was zu tun ist. Ich bin neu mit beiden Dingen, also brauche ich hier wenig Hilfe. –

+1

Ich möchte vorschlagen, dass Sie einfach nicht ein Passwort entschlüsseln, sondern das eingehende Passwort mit dem gleichen Schlüssel (oder Salz) verschlüsseln und die beiden Verschlüsselungen vergleichen. Hinterlassen Sie das Passwort als Super-Duper-Geheimnis mit der Person, die es zur Verfügung gestellt hat. : D – DevilsHnd

Antwort

1

Ihr Problem ist, dass Sie mit DES verschlüsseln und mit AES entschlüsseln.

Sie generieren auch einen Schlüssel aus der Passphrase für Ihren Java-Code, verwenden ihn jedoch direkt in Ihrem JavaScript-Code.

Sie verwenden Salz auf der Java-Seite, scheinen aber das Salz nicht in die Nachricht aufzunehmen. Mit der Passphrase von salt + können Sie den Schlüssel wiederherstellen und iv.

Sie müssen sich nach anderen Beispielen umsehen, die an beiden Enden AES verwenden, die den Schlüssel auf die gleiche Weise generieren und die gleiche Auffüllung verwenden.

Etwas nach dem Vorbild dieser:

// Generate a temporary key. In practice, you would save this key 
// Encrypting with AES Using a Pass Phrase 
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), saltBytes, 100, 128); 
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
SecretKey aesKey = keyFactory.generateSecret(keySpec); 
ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

// Prepare the parameters to the cipthers 
IvParameterSpec ivParameterSpec = new IvParameterSpec(aesKey.getEncoded()); 
ecipher.init(Cipher.ENCRYPT_MODE, aesKey, ivParameterSpec); 

Sie müssen auch TLS als jemand für die Kommunikation zu prüfen, nur in den Kommentaren erwähnt, da es ziemlich schwierig ist, symmetrischen Verschlüsselungsschlüssel/Paßphrasen auf der JS Seite zu sichern .

Verwandte Themen