Защита паролем AES с использованием CryptoJS на клиенте и шифра Java на сервере
Я пытаюсь зашифровать пароль, отправленный на стороне клиента, используя CryptoJS Javascript, и расшифровать его на стороне сервера, используя класс шифра Java.
На стороне клиента:
<html>
<body>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/pad-nopadding.js"></script>
<script>
var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');
var encrypted = CryptoJS.AES.encrypt("A Sample Message", "SecretPassphrase", { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.NoPadding, iv: iv });
console.log("iv: " + encrypted.iv.toString(CryptoJS.enc.Hex));
console.log("ct: " + encrypted.ciphertext.toString(CryptoJS.enc.Hex));
</script>
</body>
</html>
Вывод, который я получаю на Firebug:
iv: a43e384b24e275c29a8a68bc031fd79e
ct: c86b6ca4ef30fadfea28821e04aa8dad
На стороне сервера:
import java.nio.charset.Charset;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.*;
public class AES {
public static String decrypt(String encryptedData) throws Exception {
byte[] keyBytes = "SecretPassphrase".getBytes();
Key key = new SecretKeySpec(keyBytes, "AES");
Cipher c = Cipher.getInstance(ALGO);
byte[] iv = (byte[]) new Hex().decode("a43e384b24e275c29a8a68bc031fd79e");
IvParameterSpec ivspec = new IvParameterSpec(iv);
c.init(Cipher.DECRYPT_MODE, key, ivspec);
byte[] decordedValue = (byte[]) new Hex().decode(encryptedData);
byte[] decValue = c.doFinal(decordedValue);
String decryptedValue = Hex.encodeHexString(decValue);
return decryptedValue;
}
public static void main(String[] args) throws Exception {
String result = AES.decrypt("c86b6ca4ef30fadfea28821e04aa8dad");
System.out.println(hexToString(result));
}
}
Мне нужна помощь о том, что я делаю неправильно и почему я получаю случайный iv
на моей стороне клиента, когда я ограничиваю его использование прошло iv.
1 ответ
Вы передаете ключевую фразу вместо ключа на стороне клиента. Таким образом, он будет производить извлечение ключей OpenSSL, вероятно, генерируя IV там же.
Выполнение SecretPassphrase".getBytes()
это то, что вы никогда не должны делать. Используйте шестнадцатеричные числа, если вы хотите, чтобы ваш ключ был текстом, и преобразуйте его в двоичный файл, используя шестнадцатеричное декодирование.