2015-02-05 2 views
0

Я хочу расшифровать массив байтов. для этого я шифрую данные в java с открытым ключом серверов. Затем я отправляю данные на сервер C#. Там я хочу расшифровать с помощью класса «RSACryptoServiceProvider». Я инициализировать его:Дешифрование с помощью RSACryptoServiceProvider сбой

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024); 
rsa.ImportParameters(keyInfo); 

Переменная (RSAParameters) «KeyInfo» инициализируется с «модулем» и «PrivateKey»

keyInfo.Modulus = m.getBytes(); 
keyInfo.D = d.getBytes(); 

Значения для «м» и «д» являются жестко закодированные и из экземпляра BigInteger от here. Я знаю, что жесткий код плохой, но в настоящее время я могу это сделать.

Когда мне это нравится, исключение вызывает «плохие данные». При добавлении открытого ключа в

keyInfo.Exponent = pubExpBytes

затем она проходит, но исключение выбрасывается позже «Ключ не существует» в методе

result = rsa.Decrypt(inputBuf, false); 

и свойство «PublicOnly» верно даже хотя я добавил ключ в «keyInfo.D».

Что я делаю неправильно?

+0

Как вы загружаете объект BigInteger? что-то вроде BigInteger bigInt = 235235235235 ......;? –

+0

Я загрузился следующим образом: BigInteger m = новый BigInteger (modByteArray); но теперь я пытаюсь использовать xml-строку – chef

+0

В java-коде не используется отступ по умолчанию. Но есть случайные байты. Является ли это проблемой для меня или нет, я должен учитывать это при расшифровке? Как я могу дешифровать правильно все же? Проблема в том, что теперь я получаю исключение «Bad Data» из «Decrypt» -метода. Btw. Я не могу изменить код Java – chef

ответ

1

При использовании секретного ключа RSACryptoServiceProvider состоит из модулей Modulus, Exponent, P, Q, DP, DQ, InverseQ и D. Лучше всего, чтобы загрузить ключ из XML-строки, как:

string xmlKey = "<RSAKeyValue><Modulus>2CASUiCNfcCc/Y2gCJwmUPc1VWwsPiMW/4s4EqUWaq29WYQsZj+xUFAlQHLG1VOorjD+UU30Yj3acr4O3b/5iDfsW+2zDc1UB/T+fvzMv6nLNIMJAVST+7GulAbzcmItrdcWi9UN6VWICYatg6QFi2eJIibfwrorzA2v4NXUrja2/OpbePDeIW0NmU2y+U9kl2n0XvQOy87751iRE0bFzRBOzURumh+ZE7pYDXodf50B72bPl/ytKUPzwMOCzOA4qRoROWHwCh5puT8i1FHN8HGykZCZE7s3Enf7UpJ8hp4N4caODQCeBJhISSosN0YTCNIsT76CjyXQwQOMVrDGLQ==</Modulus><Exponent>AQAB</Exponent><P>81hQqq4N6+ejjtvynaALqwrGX9A7F6xhipYRGUzT4bQ+6n/Z2maADtOw1k2nd1Uz6NmneYGtQkzkqpEgQvJ89Ds0m/ndDqySKpV+qWJzW8QeLmm7rqhcVmjMqaTYYfb2nJj0C7a9ixf8JsKKV5I6Q4E8iZNDJQkD0Ap1mXwEXX8=</P><Q>411gemkRFxg/mu51aHk6F/D/kfgBZHV7pGohzgJ3LFFfDxsLviWeLLWcLna9nV9YZpP7QaNchIHOiRq63I/JPn9E+gieTWpAFTLOVhNRdchdI8sE/OUTE7Q8CAeNHlZWqv6DZpUxPBWNFaqO2zuq2t104CAItwFfp+599mkgilM=</Q><DP>OA2Hx0kAe+6HhkizwgszpNp+h2N3uSRD86BNn/5KcBsMwwdgLyadKM0qVrLceGhv5Jr+MMbmGfeMVJ3JSKKCld9tZuBPQyoNITH+UxYSbHjoWtiQGtM9McpCGnGWRjqU4813qZsWXgvQUT1OkI1mTlZek3IQbV9+OVWvcQNYHhE=</DP><DQ>a1ehfglurSWgmefs/GcHe1gngOXC2ofw2N3WmelmFEFSjNIrCBnAhME1PGaI/OyP0tYYsJOM0W5rcSVyhUFJNL1ndlhtTIVWPevfqJm0QtRWzNhDwZXxHMNh+DSAdosyncZNiTf0p7ZRBqKgkXapIm2diVb2Zlg6rhEV3Ski2Ms=</DQ><InverseQ>XQJzVm1AFLJkbsrGb19MUOauBiDzlssX8VXT3A9gB0zsVclhgWpZMMKia1iAgrTg5nqhy2PIqvBJ9Vu3GGO6IP0lmLXwI83cOhso7AIz9dAknI4xR4LlLKtnbmw6ozwWMzxx+5fsKDbnTB5wiAIepZDXARdm9bmr791mXJXZQWA=</InverseQ><D>YbeygOaOAscVVED2FB6B5oa3Ww2jPV8BNX59VlTFO2udmr07k+mFYrIx/Z9HjkmakVO+kQVFkyuzOsD7GMEFclUSrYfeNsXZEhXwAXuMmbYMFgyPBEZ4+Eqgi/ZOmS+RxrFi1Mt6VD8jWGdHyabeCOdBpircbf9d8Q9ZL7eOx0tKAnn4QCcxxErDsRbAYLWKF8SClSGgEu2sfvBU/zMvJ2Lm6XTepItyfzWp+/eiN6ovg6OjuUtg4p7i8jEWP7M/LmLqAusjBtSve+0HF+d38DyD2kL6+ocIPwpXyuY5DjMazJtTCarmr+ryKkiUdFRtmwRf6XufFZSHrsEnmzEp0w==</D></RSAKeyValue>" 
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
rsa.FromXmlString(xmlKey); 
byte[] decryptedData = rsa.Decrypt(inputBuf, false); 

Вы можете увидеть, что каждый из тегов XML в строке счета для каждого компонента ключа.

Открытый ключ состоит только из Модуля и Экспонента. Добавление всех остальных компонентов делает ключ закрытым. Установленные вами значения не содержат некоторых частных компонентов, и поэтому PublicOnly является истинным. Чтобы избежать путаницы, открытый ключ - это то, что шифрует данные, а закрытый ключ - единственный способ расшифровать его, который вы будете использовать в своем коде сервера C#.

(Ключ в этом примере 2048 просто использовать 1024 для использования)

+0

, это помогло мне thx. почему недостаточно частного показателя с модулем? функция дешифрования «m = c^d (mod n)», поэтому этих двух параметров должно быть достаточно? это по соображениям производительности? – chef

+0

Да, я помню, что причина, дешифрование и подписание значительно ускоряются с использованием дополнительных компонентов и как работает реализация .Net. Я помню что-то читал, но не могу вспомнить, где. –

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