M2Crypto: PKey - это ссылка на открытый или закрытый ключ?
В документации класса PKey пакета Python M2Crypto (обертка OpenSSL для Python) говорится, что PKey является ссылкой на открытый ключ.
Вместо этого я считаю, что это ссылка на закрытый ключ, потому что метод init класса PKey вызывает функцию openssl evp_pkey_new, которая по этой ссылке: http://linux.die.net/man/3/evp_pkey_new должна выделить новая ссылка на структуру закрытого ключа!
Есть только два возможных объяснения: документация M2Crypto неверна или ссылка, о которой я сообщил, содержит неверную информацию.
Может ли кто-нибудь помочь мне найти правду?
2 ответа
Документация OpenSSL неполная - EVP_PKEY
структура, выделенная EVP_PKEY_new()
используется для хранения закрытых или открытых ключей. Тип ключа определяется тем, что вы позже загрузите в структуру.
(Например, оба EVP_SealInit()
а также EVP_OpenInit
принимать EVP_PKEY
параметры).
В документации для EVP_PKEY_new прямо говорится о том, как она использовалась для хранения закрытых ключей. И я заблудился, так как оригинальный постер таков, поскольку x509foo.get_pubkey() просто возвращает экземпляр EVP.PKey, а сохранение этого экземпляра в виде pem показывает PRIVATE KEY. Я не могу притворяться, что знаю намерение команды M2Crypto, так как многие функции, использующие PKey, не документированы. Например, у объекта запроса x509 есть функция verify(self,pkey), но он ничего не говорит мне о том, что это за объект pkey. Точно так же есть или любая документация. Я так же запутался, как и первоначальный автор, так как я думаю о RSA по меньшей мере nn в терминах (e,n)# открытого ключа (d,n)# частного ключа
и в лучшем случае я думаю о Privatekeys (d,n,p,q,dp,dq,qinv,t), где p и q - большие простые числа dp, а dq и qinv - дополнительные коэффициенты для ускорения дешифрования, а t - как функция totient.,
Причиной того, что различие должно быть прояснено в документации, является то, что иногда вы хотите зашифровать с помощью закрытых ключей (в случае подписи), чтобы все остальные могли проверить путем расшифровки с использованием открытого ключа. h = hash(m) sig = h^d (mod n) только тот, кто знает d (закрытый ключ), может создать подпись. Проверка производится
h = sig^e (мод n)
если два хэша совпадают, вы знаете, что сообщение является подлинным.
У меня проблема в том, что требования EVP.Pkey представляют открытый ключ, но его метод assign_rsa() объявляет, что он принимает пару ключей RSA ("Я предполагаю, что на данном этапе это означает закрытый ключ". Любые примеры I " До сих пор мы обнаружили, что они предназначены только для создания самоподписанного сертификата (включая собственные модульные тесты M2Crypto. Я не вижу тестов, которые бы принимали сторонний запрос x509 и подписывали его собственным сертификатом и ключом, как мы обычно видим в реальности). Модульные тесты не помогают мне понять, как подписывать общие CSR, так как запросы X509 не будут содержать закрытый ключ. Тем не менее примеры модульных тестов работают нормально, так как самоподписанный и подписавший уже имел доступ к приватному ключу. ключи. На самом деле тест test_mkcert делает именно то, что он принимает закрытый ключ, возвращенный методом mkreq, который генерирует запрос x509.
Документы M2Crypto сбивают с толку, поскольку они взаимозаменяемо используют термины pk, pkey и даже pubkey.