M2Crypto: PKey - это ссылка на открытый или закрытый ключ? - PullRequest
0 голосов
/ 01 мая 2010

В документации класса PKey пакета Python M2Crypto (оболочки OpenSSL для Python) говорится, что PKey является ссылкой на открытый ключ.

Вместо этого я считаю, что это ссылка на закрытый ключ, поскольку метод init класса PKey вызывает функцию evp_pkey_new openssl, которая по этой ссылке: http://linux.die.net/man/3/evp_pkey_new должна выделить новую ссылку на закрытый ключ структура!

Есть только два возможных объяснения: документация M2Crypto неверна или указанная мной ссылка содержит неверную информацию.

Может ли кто-нибудь помочь мне найти правду?

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

В документации для EVP_PKEY_new прямо указывается, что она использовалась для хранения закрытых ключей. И я заблудился, так как оригинальный плакат таков, поскольку x509foo.get_pubkey () просто возвращает экземпляр EVP.PKey, а сохранение этого экземпляра в виде pem показывает PRIVATE KEY. Я не могу притворяться, что знаю намерение команды M2Crypto, поскольку многие функции, использующие PKey, не документированы. Например, объект запроса x509 имеет команду verify (self, pkey), но ничего не говорит мне о том, что это за объект pkey. Точно так же есть или любая документация. Я так же запутался, как и оригинальный автор, так как я думаю о RSA, по крайней мере, с точки зрения (e, n) # Открытый ключ (d, n) #Частный ключ

и в лучшем случае я думаю о Privatekeys (d, n, p, q, dp, dq, qinv, t) где p и q - большие простые числа dp, а dq и qinv - дополнительные коэффициенты, чтобы сделать расшифровываем быстрее и используем как функцию.

Причина, по которой различие должно быть более четко указано в документации, заключается в том, что иногда вы хотите зашифровать с помощью закрытых ключей (в случае подписи), чтобы все остальные могли проверить их путем расшифровки с использованием открытого ключа. h = хэш (м) sig = h ^ d (мод n) только тот, кто знает d (закрытый ключ), может создать подпись. Проверка сделана

h = sig ^ e (mod n)

если два хэша совпадают, вы знаете, что сообщение является подлинным.

Проблема, с которой я столкнулся, заключается в том, что EVP.Pkey заявляет, что еще не представляет открытый ключ. его метод assign_rsa () объявляет, что он принимает пару ключей RSA («Я предполагаю, что на данный момент это означает закрытый ключ». Любые примеры, которые я обнаружил, пока только для создания самоподписанного сертификата (включая собственные модульные тесты M2Crypto Я не вижу никаких тестов, которые бы принимали сторонний запрос x509 и подписывали его собственным сертификатом и ключом, как мы обычно видим в реальности. Модульные тесты не помогают мне понять, как подписывать общие CSR, начиная с запросов X509, не будут содержать закрытый ключ. Тем не менее примеры модульных тестов работают нормально, так как самоподписанный подписчик уже имел доступ к закрытым ключам. Infact тест test_mkcert делает именно то, что он принимает закрытый ключ, возвращенный обратно метод mkreq который генерирует запрос x509.

Документы M2Crypto сбивают с толку, так как они используют термины pk, pkey и даже pubkey взаимозаменяемо.

1 голос
/ 03 мая 2010

Документация OpenSSL неполная - структура EVP_PKEY, выделенная EVP_PKEY_new(), используется для хранения открытых или открытых ключей. Тип ключа определяется тем, что вы позже загрузите в структуру.

(например, EVP_SealInit() и EVP_OpenInit принимают EVP_PKEY параметры).

...