2010-10-05 2 views
0

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

н: C053094BFABF26D431CF33E028770DBB15F4AE76820B5150181F1BF42C5CF3AA7BDB459ACA77D610497F94FFA017BC07EF030E3D3450CAE7E706F352B7D7575CA6B89A5B3C953028E562F7F698C97FDD490EDF4788F073362C743B70AF2C61A17FA495E5801CC8EA1A732C9E8985DB4E8A22EAB97407806F8D7CDDF0BF3CD9F3

е: 10001

р: D9CC00CD811FB052A0EF27332597DA89AAA6B042A1A01A8944229EE680C964148BB07AFBD2EBE467CC9B28E41B5897132F9AFDCD7C5B794CD37E3245A0BC18F5

д: E20F35A3B49B49A35DE25E285EE9B2DC5F3B5FDDD281892F4BE3C54768CBE09 272667FF137C5ED9CADD42FF18A8B08FFA9A82C0CF26169B0940F60BEF2AD7647

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

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

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

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

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

ответ

1

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

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

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

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

0

OpenSSL/pem.h имеет следующие функции для чтения/записи RSA ключей (из файла) PEM_write_RSAPrivateKey PEM_read_PrivateKey

PEM_write_RSAPublicKey PEM_read_RSAPublicKey

, если она до сих пор неясно, как использовать их только спросить. Я представлю вам несколько примеров :-)

+0

Если вы можете предоставить мне несколько примеров, я был бы очень признателен! Большое спасибо за вашу доброту. – Kerby82

0

Это образец для 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, см., Что вы можете столкнуться с проблемами, потому что , поэтому P<Q !!. Меняя ваши номера P и Q до того, как какой-либо расчет решает его, если я прав (я абсолютно НЕ УВЕРЕН об этом вопросе, может кто-нибудь подтвердить? Thnx)

Наконец, преобразуйте все числа в base64 и постройте вышеприведенный XML состав.

ШАГ 2

С BouncyCastle, это проще.

Загрузите BouncyCastle.dll, скопируйте в папку проекта (или где угодно) и добавьте ссылку на него в свой проект VB; Теперь у вас будет новым «орг» пространство имен, и вы можете написать:

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) 

Надеется, что это помогает всем недоноскам, как я, кто потеющихся как я, глядя на всю процедуру.