Это пример для RSA в проекте VB.NET.
ШАГ 1
Сначала вы должны отформатировать N, E, P, Q, DP, DQ, InverseQ, D данные ключа ( все они !! см. Далее) в base64 и построить с ними структурированную XML-строку (или файл), например:
<RSAKeyValue>
<Modulus>vbBYUkGHX4YI1Rcovx+Ewz2OW1Iix</Modulus>
<Exponent>AQ...</Exponent>
<P>5w/iuGIBZdTYasdfalksdkkdkdksdldfdfs</P>
<Q>0ilXTMYjwhp+JvQPo3gnRAF0EgoHPm6tBt1</Q>
<DP>JS2gLEzQrsLlnlkQCRZ55+RtM6cphJSa5x</DP>
<DQ>RMWugbsdHHma6phXPcEl6EUpfHW3pSCGko</DQ>
<InverseQ>h54IMS+ZabAn/WzOFTApgB4y16Az</InverseQ>
<D>OjnoUo+E02CcU3TBcDFnmlrJ2ORUcXCy5FB</D>
</RSAKeyValue>
(Конечно, это фальшивка, не пытайтесь ее использовать, или она выдаст ошибку)
Как сказал даджамес, у вас также должны быть D, DP, DQ и InverseQ.Если у вас их нет, все становится сложнее, но не невозможно, потому что вы должны рассчитать их самостоятельно.Самым простым способом (для меня) был доступ к исходному коду инструмента, который строит для меня числа P и Q.Внутри него были классы для работы с такими большими числами.Слегка изменив код, я мог бы вычислить:
DP = ( 1 / Exponent) mod ( P - 1 )
DQ = (1 / Exponent ) mod ( Q - 1 )
InverseQ = ( 1 / Q ) mod P where P > Q
См. Последнюю строку, вы должны принять во внимание, что стандарты требуют P>Q
, иначе ключ будет отклонен.Тем не менее, инструмент, который я использовал с Delphi (TPLockBox 2.0), не заботился об этом.
Отметив, что выше шестнадцатеричные числа XML являются прямым порядком байтов, и наблюдая за вашими клавишами P и Q, убедитесь, что у вас могут возникнуть проблемыпотому что D9<E2
, значит P<Q
!!.Поменяйте местами числа P и Q, прежде чем какой-либо расчет решит их, если я прав (я абсолютно НЕ уверен в этом, может ли кто-нибудь подтвердить? Thnx)
Наконец, преобразуйте все числа в base64 и соберитеприведенная выше структура XML.
ШАГ 2
С BouncyCastle это проще.
Загрузите BouncyCastle.dll, скопируйте в папку своего проекта (или где-либо еще) и добавьте ссылкук нему в ваш проект VB;теперь у вас будет новое пространство имен "org", и вы можете кодировать:
Dim r As New RSACryptoServiceProvider()
' NOTE: substitute next string with above-like XML,
' or load it from a file or what you prefer:
r.FromXmlString("<RSAKeyValue><Modulus>vbBYUkGHX4YI1Rcovx+Ewz2OW........</RSAKeyValue>")
Dim key As Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair = Org.BouncyCastle.Security.DotNetUtilities.GetRsaKeyPair(r)
' Export to a PEM file:
Dim fOut As New IO.StreamWriter("c:\keys.pem", False)
Dim pw As New Org.BouncyCastle.OpenSsl.PemWriter(fOut)
pw.WriteObject(key)
Надеюсь, это поможет всем нубам, таким как я, которые потели, как и я, когда искали всю процедуру.