Шестнадцатеричные ключи RSA в формате PEM - PullRequest
0 голосов
/ 05 октября 2010

У меня есть информация о n, p, q, где n = pq, а p и q - большие простые числа, которые будут использоваться для алгоритма RSA. Например:

п: C053094BFABF26D431CF33E028770DBB15F4AE76820B5150181F1BF42C5CF3AA7BDB459ACA77D610497F94FFA017BC07EF030E3D3450CAE7E706F352B7D7575CA6B89A5B3C953028E562F7F698C97FDD490EDF4788F073362C743B70AF2C61A17FA495E5801CC8EA1A732C9E8985DB4E8A22EAB97407806F8D7CDDF0BF3CD9F3

е: 10001

p: D9CC00CD811FB052A0EF27332597DA89AAA6B042A1A01A8944229EE680C964148BB07AFBD2EBE467CC9B28E41B5897132F9AFDCD7C5B794CD37E3245A7

q: E20F35A3B49B49A35DE25E285EE9B2DC5F3B5FDDD281892F4BE3C54768CBE09272667FF137C5ED9CADD42FF18A8B08FFA9A82C0CF26169B0940F607EF94

Я хочу сгенерировать закрытый и открытый ключ PEM из этих значений.

Я полагаю, они в шестнадцатеричном формате, но я действительно не знаю, что содержится в ключе в формате pem. Я знаю, что PEM просто означает, что ключ - base64 с некоторыми другими нижними колонтитулами дополнений (начинайте публично и т. Д.).

Любые предложения или пример кода?

Я имею в виду, что моя цель из этого значения получить два файла в закрытом и открытом ключах PEM для передачи, например, в openssl.

Большое спасибо, Andrea

Ответы [ 3 ]

1 голос
/ 08 октября 2010

Ключи RSA в кодировке PEM - это, в основном, двоичные ключи в формате, описанном PKCS # 1 (RFC 3447), в кодировке base-64, в окружении заголовка и нижнего колонтитула ASCII.

Обратите внимание, что PKCS # 1Формат требует, чтобы закрытый ключ включал не только d, e, p и q, но также и другие значения, используемые для теоремы остатка в Китае (d mod (p-1), d mod (q-1) и (обратное к q)мод р).Их легко вычислить, если вы знаете p и q.

Если ключи зашифрованы, то есть кое-что еще, поскольку у вас также должны быть некоторые заголовки PEM, описывающие шифрование.

Тамэто пример кода в исходных кодах OpenSSL (хотя он почти не комментируется и довольно трудно следовать).На самом деле вам лучше читать соответствующие RFC и проверять свой код на OpenSSL, чтобы убедиться, что вы правильно поняли.

0 голосов
/ 16 декабря 2010

Это пример для 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)

Надеюсь, это поможет всем нубам, таким как я, которые потели, как и я, когда искали всю процедуру.

0 голосов
/ 14 октября 2010

openssl / pem.h имеет следующие функции для чтения / записи ключей RSA (из файла).Я приведу несколько примеров: -)

...