AES-Verschlüsselung mit Java-und Entschlüsselung mit Javascript
Mache ich eine Applikation muss die Java-basierte AES-Verschlüsselung-und JavaScript-basierte Entschlüsselung.
Ich bin mit dem folgenden code für die Verschlüsselung als eine grundlegende form.
public class AESencrp {
private static final String ALGO = "AES";
private static final byte[] keyValue =
new byte[] { 'A', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'i', 'j', 'k','l', 'm', 'n', 'o', 'p'};
public static String encrypt(String Data) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = c.doFinal(Data.getBytes());
String encryptedValue = new BASE64Encoder().encode(encVal);
return encryptedValue;
}
private static Key generateKey() throws Exception {
Key key = new SecretKeySpec(keyValue, ALGO);
return key;
}
}
Das JavaScript, das ich bin versucht, zu entschlüsseln, ist
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"> </script>
var decrypted = CryptoJS.AES.decrypt(encrypted,"Abcdefghijklmnop").toString(CryptoJS.enc.Utf8);
Aber die JavaScript-Entschlüsselung nicht funktioniert. Ich bin neu hier, könnte mir jemand sagen Weise zu lösen, ohne änderung der Java-code-block ?
Ich habe versucht, Base-64-Decodierung mein text wie diesen:
var words = CryptoJS.enc.Base64.parse(encrKey);
var base64 = CryptoJS.enc.Base64.stringify(words);
var decrypted = CryptoJS.AES.decrypt(base64, "Abcdefghijklmnop");
alert("dec :" +decrypted);
aber immer noch nicht gut.
Ich habe versucht die Lösung, die unten vorgeschlagen sind, um mögliche padding-Problem, aber seine nicht zu geben ist keine Lösung.
var key = CryptoJS.enc.Base64.parse("QWJjZGVmZ2hpamtsbW5vcA==");
var decrypt = CryptoJS.AES.decrypt( encrKey, key, { mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7 } );
alert("dec :" +decrypt);
- "Aber die JavaScript-Entschlüsselung funktioniert nicht" > Kannst du bitte etwas näher erläutern?
- Ich meine, die Seite Stoppt die Ausführung an der Entschlüsselung Linie, ich denke, es gibt einige Fehler in der Art und Weise bin ich versucht, es zu entschlüsseln.
- Ist es ein Fehler gedruckt in der JavaScript-Konsole? Meine erste Vermutung wäre, dass Sie noch nicht base64-dekodiert dem Chiffretext, bevor Sie versucht, es zu entschlüsseln mit CryptoJS. Siehe code.google.com/p/crypto-js/#Encoders.
- Ihr Versuch, base64 sieht defekt aus. Sollte es sein:
var words = CryptoJS.enc.Base64.parse(encrKey); var decrypted = CryptoJS.AES.decrypt(words, "Abcdefghijklmnop");
? - Ich habe versucht zu tun, wie du gesagt hast, aber immer noch nicht funktioniert. Ich Frage mich, ob das problem ist, dass ich mit secretkeyspec auf Schlüssel generieren im java-block und cryptojs in der js zu entschlüsseln, macht es keinen Unterschied ?
- Ich vermute, es wird einen Unterschied, wie die Schlüssel behandelt werden. Ich denke, CryptoJS ableiten einer 256-bit-AES-Schlüssel aus Ihrem Passwort, in der Erwägung, dass in Java Sie sind nur mit dem raw-bytes.
- Können Sie schlagen alle Weg, diese zu lösen.
- Können Sie bitte geben Sie den code für decrption in java, die ich verwendet habe, die den gleichen code für javascript.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Java-code verwendet die 128-bit-AES-Schlüssel, während Sie Ihren JavaScript-code verwendet die 256-bit-AES-Schlüssel.
Ihre Java-code verwendet die "Abcdefghijklmnop".getBytes () - als der eigentliche Schlüssel-Wert, während Sie Ihren JavaScript-code verwendet die "Abcdefghijklmnop", wie die passphrase, aus dem der Schlüssel abgeleitet wird.
Die Standard-transformation für Java AES ist ein AES/ECB/PKCS5Padding, während die Standard-transformation für CryptoJS ist AES/CBC/PKCS7Padding.
Einen Weg, um das Beispiel zu beheben JavaScript-Seite:
CryptoJS.AES.decrypt( encrKey, key, ...)
nahe dem Ende, und es scheint, dass Sie versuchen, Sie zu entschlüsseln mit key, die bedeutungslos sind. Der erste parameter sollte die verschlüsselten Daten in base64.BASE64Encoder().encode(keyValue)
in Java, um diebase64Key
Wert für JS)Für Java und JavaScript, um in der Lage zu inter agieren, ist es wichtig, dass keine Standardwerte verwendet werden, während das erstellen von Schlüssel oder Chiffre. Die iteration count, Schlüssellänge, padding, Salz und IV sollten identisch sein.
Referenz: https://github.com/mpetersen/aes-example
Beispielcode unten:
Verschlüsseln von Strings in Java:
}
Entschlüsselung der gleiche string in JavaScript: