Я зашифровал сообщение с помощью cryptojs aes 256 на стороне клиента. Но не смог расшифровать его на стороне java. Сначала я передаю ключ непосредственно на сервер как шестнадцатеричный, а затем конвертирую его из шестнадцатеричного в java bytearray. Это не сработало. Затем я передаю серверу фразу salt, iv как шестнадцатеричную. Затем сгенерируйте ключ. Это все еще не сработало. Всегда жаловаться на неправильную длину ключа.
Сторона клиента:
var salt = CryptoJS.lib.WordArray.random(16);
var salt_hex = CryptoJS.enc.Hex.stringify(salt);
var iv = CryptoJS.lib.WordArray.random(256/32);
var iv_hex = CryptoJS.enc.Hex.stringify(iv);
var key = CryptoJS.PBKDF2(secret, salt, { keySize: 256/32, iterations: 10 });
var key_hex=CryptoJS.enc.Hex.stringify(key);
var encrypted = CryptoJS.AES.encrypt(plaintext, key, { iv: iv });
var encryptedtxt = secret+":"+salt_hex+":"+iv_hex+":"+encrypted.ciphertext.toString(CryptoJS.enc.Base64)+":"+key_hex;
Сторона сервера:
if (encrypted != null)
{
//Get the passphras, salt, IV and msg
String data[] = encrypted.split(":");
String passphrase = data[0];
String salt_hex = data[1];
String iv_hex = data[2];
String msg64 = data[3];
String jskey_hex = data[4];
byte[] jskey = hexStringToByteArray(jskey_hex);
byte[] iv = hexStringToByteArray(iv_hex);
byte[] salt = hexStringToByteArray(salt_hex);
BASE64Decoder decoder = new BASE64Decoder();
byte[] msg = decoder.decodeBuffer(msg64);
try {
//theClear = AES.decrypt(encrypted);
/* Decrypt the message, given derived key and initialization vector. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), salt, 10, 256/32);
SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
String plaintext = new String(cipher.doFinal(msg), "UTF-8");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stringify()
[0x01, 0x02, 0x03]
в"123"
? Ваш код дешифрования, вероятно, предполагает"010203"
."123"
, вероятно, выдаст двухбайтовый массив[0x12, 0x03]
, который не соответствует вводу и имеет неправильную длину. Это фатально для криптографического ключа. - person rossum   schedule 25.06.2014256/32 == 8
, а поддерживаемые размеры ключей для AES - 16, 24 или 32 байта. Вам нужно будет изменить код JS и Java, чтобы использовать ключ длиной не менее 16 байт. - person Oleg Estekhin   schedule 25.06.2014