Использовать открытый ключ RSA для генерации закрытого ключа в Openssl? - PullRequest
0 голосов
/ 27 апреля 2018

Я знаю, что можно использовать эту ссылку для генерации открытого и закрытого ключа для самозаверяющего сертификата в OpenSSL. Но для данного Открытого ключа, могу ли я выяснить соответствующий Закрытый ключ? Я использовал 1024-битный открытый ключ RSA.

Поскольку у меня был этот вопрос в моей домашней задаче, говорящий:

Создать цифровую подпись для предложения «Меня зовут. Мой голос - это мой паспорт ». Это подтверждает правильность использования OpenSSL со следующим 1024-битным открытым ключом RSA. (Подсказка: модуль не мог быть сгенерирован как обычный модуль RSA.):

----- НАЧАТЬ PUBLIC KEY ----- MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCgF35rHhOWi9 + r4n9xM / ejvMEs Q8h6lams962k4U0WSdfySUevhyI1bd3FRIb5fFqSBt6qPTiiiIw0KXte5dANB6lP e6HdUPTA / U4xHWi2FB / BfAyPsOlUBfFp6dtkEEcEKt + Z8KTJYJEerRie24y + nsfZ MnLBst6tsEBfx / ​​U75wIBAw ==

----- КОНЕЦ ОБЩЕСТВЕННОГО КЛЮЧА -----

1 Ответ

0 голосов
/ 27 апреля 2018

Ключ (каламбур) к решению в подсказке:

Модуль не мог быть сгенерирован как обычный модуль RSA.

Это подход, который я выбрал.

Шаг 1: Получить простые числа

  1. Сначала я взял ваш файл и сохранил его как public.pem.
  2. Чтобы получить значение модуля (n) и общего показателя (e), я запустил:
    openssl rsa -pubin -in pub -text -noout
  3. Я преобразовал шестнадцатеричный модуль и экспоненту в десятичные числа, что привело к
    n=112420265940019545385580931264662691888876377549063413938338239508058300548918731393322848876821656910452908064089039911552450302375557565600923056341141750687524704844725632296552824986371719004485250857447936962589230504662333990648942759862805127715014382377701044586628936249950092121536791020138692688871
    e=3
  4. Я включил это число в онлайн-калькулятор факторизации , чтобы обнаружить, что одно из двух простых чисел, используемых для вычисления модуля, было относительно небольшим:
    p=55685342628135644993
    q=2018848419246646476894946094575564515176862561629979956283227393349426117194195173357244644821277073710795134539986018769393928719340504755806449531413017314396784334912136112253736003497362080917517151753555605597776865614151048604681116557282512513238254935296910445878892354969335089447

Шаг 2: Рассчитать другие необходимые значения

  1. Я вычислил значение n как ϕ(n) = (p - 1) * (q - 1), используя python. REPL:
    ϕ(n)=112420265940019545383562082845416045411981431454487849423161376946428320592635503999973422759627461737095663419267762837841655167835571546831529127621801245931718255313312614982156040651459582892231514853950574881671713352908778385051165894248654079110333265820418532073390681314653181675602213322541221954432
  2. Затем я использовал скрипт Python из этого ответа , чтобы вычислить частную экспоненту (d) и коэффициент (c), который дал:
    d=74946843960013030255708055230277363607987620969658566282107584630952213728423669333315615173084974491397108946178508558561103445223714364554352751747867497287812170208875076654770693767639721928154343235967049921114475568605852256700777262832436052740222177213612354715593787543102121117068142215027481302955
    c=1040291110785843997

Шаг 3. Создание структуры ASN.1 личного ключа

Затем я использовал вычисленные значения для создания структуры ASN.1 в файле с именем asn, как описано в в этом ответе :

asn1=SEQUENCE:rsa_key

[rsa_key]
version=INTEGER:0
modulus=INTEGER:112420265940019545385580931264662691888876377549063413938338239508058300548918731393322848876821656910452908064089039911552450302375557565600923056341141750687524704844725632296552824986371719004485250857447936962589230504662333990648942759862805127715014382377701044586628936249950092121536791020138692688871
pubExp=INTEGER:3
privExp=INTEGER:74946843960013030255708055230277363607987620969658566282107584630952213728423669333315615173084974491397108946178508558561103445223714364554352751747867497287812170208875076654770693767639721928154343235967049921114475568605852256700777262832436052740222177213612354715593787543102121117068142215027481302955
p=INTEGER:55685342628135644993
q=INTEGER:2018848419246646476894946094575564515176862561629979956283227393349426117194195173357244644821277073710795134539986018769393928719340504755806449531413017314396784334912136112253736003497362080917517151753555605597776865614151048604681116557282512513238254935296910445878892354969335089447
e1=INTEGER:37123561752090429995
e2=INTEGER:903312890059631
coeff=INTEGER:1040291110785843997

Шаг 4. Создание личного ключа

На основе структуры ASN.1 я сгенерировал закрытый ключ следующим образом:

  1. Создать закрытый ключ в формате DER:
    openssl asn1parse -genconf asn -out private.der
  2. Преобразовать закрытый ключ в формат PEM:
    openssl rsa -in private.der -inform der -out private.pem -outform pem

В результате создается файл private.pem со следующим содержимым:

-----BEGIN RSA PRIVATE KEY-----
MIIBsAIBAAKBgQCgF35rHhOWi9+r4n9xM/ejvMEsQ8h6lams962k4U0WSdfySUev
hyI1bd3FRIb5fFqSBt6qPTiiiIw0KXte5dANB6lPe6HdUPTA/U4xHWi2FB/BfAyP
sOlUBfFp6dtkEEcEKt+Z8KTJYJEerRie24y+nsfZMnLBst6tsEBfx/U75wIBAwKB
gGq6VEdpYmRdHGzsbmP7vDiYe2zYHLwQ0AKnPKNErq6KQyQC5eEngbgT4WpWl+J2
Xn+R9m0vwNbaiDam0uD3p5192BaN2tdaW5P5JjfGa95ytRBCQ/cr+z03FjG9C6zQ
QZG5eyOoMloHAfnYiJMV5SZarfTiF9BGFvtcfrjhbterAgkDBMoUFjHxL0ECeDUI
f9nbOl1O2AgI/51gfHGo/NKv+kcQenM8RO7dy9+hUAulwqMlyszSq+0GdZdgQL/i
Lz8NclSgyuUtptmaSWtjB5Tdc8boaBApGKac7vB4M1AfTkng1+SplKbkdFlCVg4n
6EvCOrUFFsLp308JSbkv2240Q93JJwIJAgMxYrl2oMorAgcDNY7r7ttvAggOb9tA
6WMDHQ==
-----END RSA PRIVATE KEY-----

Шаг 5: Проверка результата

Чтобы проверить, соответствует ли созданный закрытый ключ (в private.pem) предоставленному открытому ключу, я просто сгенерировал новый открытый ключ из закрытого ключа:

openssl rsa -in private.pem -pubout

Это дает следующий вывод:

writing RSA key
-----BEGIN PUBLIC KEY-----
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCgF35rHhOWi9+r4n9xM/ejvMEs
Q8h6lams962k4U0WSdfySUevhyI1bd3FRIb5fFqSBt6qPTiiiIw0KXte5dANB6lP
e6HdUPTA/U4xHWi2FB/BfAyPsOlUBfFp6dtkEEcEKt+Z8KTJYJEerRie24y+nsfZ
MnLBst6tsEBfx/U75wIBAw==
-----END PUBLIC KEY-----

Этот вывод в точности соответствует предоставленному вами открытому ключу.

...