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