2015-03-23 2 views
0

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

Ниже мой код

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]���� 
+1

Вы не сохраняете символы юникода, или там, где вы печатаете сообщение, нет поддержки для их отображения. По умолчанию консоль не работает. – Mathemats

+0

Как я могу сохранить? У дешифрованного текста (между символами нежелательной почты) нет никаких проблем. – Raghu

+0

* «Как я могу сохранить?» * - Используйте UTF-8 везде для системного соединения. Его наиболее совместимо. Вам все равно может потребоваться преобразовать в локальную кодировку (например, UTF-16 в Windows). – jww

ответ

0

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

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

Отметьте, что "PKCS5Padding" does perform PKCS#7 padding в Java.

+0

Извините, я не получил «Вместо нуля IV вы должны использовать первые 16 байтов вашего зашифрованного текста для cipher2». И как я могу явно исключить? Как насчет мусора в конце текста? включение прокладки (PKCS5Padding) метать "javax.crypto.BadPaddingException: блокировка блока повреждена". – Raghu

+0

В 'IvParameterSpec ivSpec = новый IvParameterSpec (новый байт [16]);' используйте первые 16 байтов 'cipherTextBytes'. Вы можете использовать метод 'Arrays.copyOfRange' для разделения массива байтов на два. –

+0

cipherTextBytes был получен в конце кода и после ivSpec. Вы имеете в виду какой-то другой текст? – Raghu

Смежные вопросы