Расшифровка RSA AES с ненужными символами

Я пытаюсь расшифровать ответ saml, используя AES и RSA, и мне удалось правильно расшифровать утверждение saml. Но расшифрованный текст встраивается в некоторые ненужные символы, что вызывает исключения при синтаксическом анализе.

Ниже мой код

InputStream privateKeyFileInputStream = Check.class.getClassLoader().getResourceAsStream("rsa_privatekey.key"); 
rsaPrivateKey = new byte[privateKeyFileInputStream.available()];
privateKeyFileInputStream.read(rsaPrivateKey);

PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC");
PrivateKey privKey = keyFactory.generatePrivate(privateKeySpec);

Cipher cipher1 = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding", "BC");
cipher1.init(Cipher.DECRYPT_MODE, privKey);

byte[] encryptedMessage = Base64.decodeBase64(aesPrivateKeyEnc.getBytes());
aesPrivateKey = cipher1.doFinal(encryptedMessage);

IvParameterSpec ivSpec = new IvParameterSpec(new byte[16]);
SecretKeySpec key = new SecretKeySpec(aesPrivateKey, "AES");
Cipher cipher2 = Cipher.getInstance("AES/CBC/NoPadding", "BC");
cipher2.init(Cipher.DECRYPT_MODE, key, ivSpec);

byte[] cipherTextBytes = Base64.decodeBase64(cipherText);        
byte[] decryptedMessage = cipher2.doFinal(cipherTextBytes);

String message = new String(decryptedMessage, "UTF8");

Теперь сообщение имеет

R����=2�W���?<saml:Assertion ...... </saml:Assertion>��fE]����

person Raghu    schedule 23.03.2015    source источник
comment
Вы не сохраняете символы Юникода или везде, где вы печатаете, сообщение не поддерживает их отображение. Консоли по умолчанию нет.   -  person Mathemats    schedule 24.03.2015
comment
Как я могу сохранить? Расшифрованный текст (между ненужными символами) не имеет проблем.   -  person Raghu    schedule 24.03.2015
comment
Как я могу сохранить? - Используйте кодировку UTF-8 везде для межсистемного соединения. Его наиболее совместимо. Вам все еще может потребоваться преобразовать кодировку в локальную (например, UTF-16 в Windows).   -  person jww    schedule 24.03.2015


Ответы (1)


Кажется, что ваше значение IV предшествует зашифрованному тексту. Вместо нулевого IV вы должны использовать первые 16 байт вашего зашифрованного текста для cipher2. Не забудьте исключить их из шифрования. Это объясняет мусор в начале.

Также кажется, что ваш cipher2 должен быть настроен для заполнения. Вероятно, это заполнение PKCS # 7. Пожалуйста, попробуйте "AES/CBC/PKCS5Padding" вместо "/NoPadding". Если это не сработает, вам нужно обновить свой вопрос, указав открытый текст в шестнадцатеричном формате, чтобы мы могли определить, какое заполнение используется. Это должно объяснить мусор в конце.

Обратите внимание, что "PKCS5Padding" выполняет дополнение PKCS#7 в Java.

person Maarten Bodewes    schedule 24.03.2015
comment
Извините, я не понял Вместо нуля IV вы должны использовать первые 16 байт вашего зашифрованного текста для cipher2. И как я могу исключить явно? А как же мусор в конце текста? включение заполнения (PKCS5Padding), вызывающее исключение javax.crypto.BadPaddingException: блок заполнения поврежден. - person Raghu; 24.03.2015
comment
В IvParameterSpec ivSpec = new IvParameterSpec(new byte[16]); используйте первые 16 байт cipherTextBytes. Вы можете использовать метод Arrays.copyOfRange, чтобы разделить массив байтов на две части. - person Maarten Bodewes; 24.03.2015
comment
cipherTextBytes был получен в конце кода и после ivSpec. Вы имеете в виду какой-то другой текст? - person Raghu; 24.03.2015
comment
Нет я не. Я не вижу никаких проблем с заменой new byte[16] на первые 16 байтов cipherTextBytes. Вы пробовали? - person Maarten Bodewes; 24.03.2015
comment
Я сделал изменение как IvParameterSpec ivSpec = new IvParameterSpec(Arrays.copyOfRange(Base64.decodeBase64(cipherText), 0, 16)); что привело к ~魨g*(‹2�B!@3‹saml:Assertion›....‹/saml:Assertion›��fE]���� - person Raghu; 24.03.2015
comment
Вам по-прежнему необходимо разделить зашифрованный текст на две части (пропустить или удалить байты IV после их извлечения). Не могли бы вы закодировать результат расшифровки открытого текста в шестнадцатеричном или базовом формате 64 и опубликовать его здесь? Случайные данные потеряют информацию, если вы обработаете их непосредственно как строку, поэтому они не дадут нам никакой информации. - person Maarten Bodewes; 26.03.2015
comment
Я использовал RSA для алгоритма, я изменил его на RSA/ECB/PKCS1Padding, и проблема была решена. Больше никаких лишних символов - person steveen zoleko; 21.01.2017
comment
@steveenzoleko Для меня это звучит как другая проблема. Если расшифровка не удалась, результатом часто является просто случайный открытый текст. - person Maarten Bodewes; 21.01.2017