У нас есть приложение .NET, которое шифрует и расшифровывает текст и сохраняет его в базе данных. Я обнаружил, что разработчик .Net сохранил ключ RSA в формате XML. Когда они сделали с шифрованием текст хранится в базе данных со следующей схемой:. Net RSA Encryption, Java RSA Decryption
0D-E4-1D-91-44-2B-B5-3B-03-34...and so on (total of 383 characters)
Мы портирование существующих приложений .Net на платформе Java. Для этого я хочу использовать существующие кодированные данные для декодирования.
Я написал следующий код в Java (копия вставленный из Интернета - я не имею ни малейшего представления о RSA или любого рода криптография)
public String decryptText (byte[] encryptedText) throws Exception {
String decryptedText = null;
if (rsaData != null) {
byte[] modBytes = Base64.decodeBase64(rsaData.getModulus().trim());
byte[] dBytes = Base64.decodeBase64(rsaData.getD().trim());
BigInteger modules = new BigInteger(1, modBytes);
BigInteger d = new BigInteger(1, dBytes);
KeyFactory factory = KeyFactory.getInstance("RSA");
Cipher cipher = Cipher.getInstance("RSA");
RSAPrivateKeySpec privSpec = new RSAPrivateKeySpec(modules, d);
PrivateKey privKey = factory.generatePrivate(privSpec);
cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] decrypted = cipher.doFinal(encryptedText);
decryptedText = new String(decrypted);
}
return decryptedText;
}
где rsaData = ссылка, которая содержит данные XML. Мой XML выглядит следующим образом:
<RSAKeyValue>
<Modulus>
ynKHV6Tm/tV7ZsTRMLNjMqlAkbftMXA/OkM5zi6+ih371Jgi6ZNX2T4ml0DmK1hojwumHadiX3YoPlaJ/xiys4NRxbDH9VuJJeTdZvoB8heKxACaIw9l1CCTEkx3jYVJ+h6M10fV3wChD0BOtiLg3rMO64LpR2DAGZNbVjXL3h0=
</Modulus>
<Exponent>AQAB</Exponent>
<P>5QUpIuwCOqR03GqI0K7Y4yWn0hvYa7b9RkCA9Y1QQ0IyBqfiTYOT87cKBRsu4FxH6tdY0khfFCskFgumx22gOw==</P>
<Q>4kv69rnEMxSOzmg4ZkAuxrUc6wZCuIJAgSL9gGBFukQSIB6UVWXYhNUDzklcMtGE/lRmwJvwSIlpZBlVtlYthw==</Q>
<DP>ae7LKlYUad+sFlBI3I4j0F2YlL1AjAJmgNpRTEODPrkdvqplKQmVpAOkZNxAAJNuyJe3g/zpzcBuvqvBBzoUBQ==</DP>
<DQ>M+iL27aG+9SWYWBkt4e3cxsuU/burRYrp7OYBK+QrwZYRgfdrK0c+nNGWTZYsMuAvzorC7l5Z5olk7GACMBB1w==</DQ>
<InverseQ>
UuLEf34YsvFxzgzKhdONvFhsSDRleC5rPR/XvpJl9NEikwXQHTr4547hYM+4soHRdBaiUFdzNtxLMlRW481L1A==
</InverseQ>
<D>
aNSFYMzzEGJbVAv2htFdPI6H8Ozc1gzZsMG+3RU3dS2xiZR9/5VcmBGmygvBJBDTk77kddaHCgeVLzKAoqeXYJGJgiNQgByE+jQz70HkOaAy0muNbAxLOk9UY6lkJ9kVbtSu1LyR83yj4+kSGNo4T63LBKV07TirAhDMJAk3o8E=
</D>
</RSAKeyValue>
Когда я вызываю метод decryptText(), передав в шифрованном тексте я получаю следующее сообщение об ошибке:
Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
Может кто-то пожалуйста, помогите в решении этой проблемы? Или указать на какую-то полезную ссылку?
Так после борьбы за несколько часов я сделал следующее:
Я обновил две строки в моем методе decryptText() следующим образом:
KeyFactory factory = KeyFactory.getInstance("RSA");
Cipher cipher = Cipher.getInstance("RSA/ECB/NOPADDING");
я понял, что зашифрованная строка была HEX закодирован, поэтому я отменил его. Таким образом, исходная строка (после удаления тире) стали:
1322829145684318159352601201165341161130212111239120172192552382321681005365571520823020721395242114149106119101747920169161831211748781201152821423521012222201691166150158120221052590252851921052281199918638104578159158115138861911531100176209133541522422481711310198179214164975320920468140732925421720220119120115314722510613321
Что после обратного шестигранной стали:
ä?D+µ;4<xt5)¡?Ôoïx¬ÿîè¨d5A9?æÏÕ_òr?jw®OÉE·y0Nx?ÖëÒ?©???xiZüUÀiäwcº&hN??s?V¿?d°Ñ?6?òø«Æ?Ö?a5ÑÌD?I?ÙÊÉ¿É??áj?
Я передал эту строку в моей выше decryptText() метод. Я ожидал, что регулярная разумную читаемую строки человека для печати назад, но я получил следующую строку:
&LÑP źç–4õ∂Ôı)¬' Ó.fi—Ø€Âótiø?R”ÀNQ°≥Y¶B˚w»Rüaûr>Vœ&˙◊@Ë¡.e¿–5 ÉP3ŒJjü&è˛LCÔ@Ÿ$‰=êyôázwQå{<7 ŸR‘BîóÅWÎhŸyÈ[èR
Так кто там, кто может мне помочь?