Как создать объект M2Crypto DSA с заданными параметрами и значениями ключа?

Используя M2Crypto, я хотел бы создать объект DSA_pub для проверки подписи DSA. Я знаю q, p, g и открытый ключ, но единственный способ, которым я знаю, создать экземпляр объекта DSA, – это использовать:

dsa = DSA.set_params(q,p,g) dsa.gen_key() 

Как назначить известный открытый ключ?

3 Solutions collect form web for “Как создать объект M2Crypto DSA с заданными параметрами и значениями ключа?”

Я просто столкнулся именно с этой задачей, где у меня есть параметры P, Q, G и Y (в моем случае из XML-документа), но у M2Crypto нет способа создать из них действительный открытый ключ.

Я прибегал к использованию pyasn1 для создания строки открытого ключа PEM, а затем для загрузки этого открытого ключа PEM с использованием фабричной функции M2Crypto.DSA.load_pub_key_bio.

Мой примерный код следует, если он кому-то полезен в будущем.

 import sys import M2Crypto if sys.version_info[0] >= 3: bin = "{0:#0b}".format from functools import reduce def _a2bits(chars): """Convert a string to its bits representation as a tuple of 0's and 1's""" return tuple(c == '1' and 1 or 0 for c in (bin(reduce(lambda x, y : (x<<8)+y, (ord(c) for c in chars), 1))[3:])) def _make_dsa_pubkey_pem(p, q, g, y): from pyasn1.type import univ, namedtype from pyasn1.codec.der import encoder import base64 class DSSParameters(univ.Sequence): componentType = namedtype.NamedTypes( namedtype.NamedType('p', univ.Integer()), namedtype.NamedType('q', univ.Integer()), namedtype.NamedType('g', univ.Integer()) ) class AlgorithmIdentifier(univ.Sequence): componentType = namedtype.NamedTypes( namedtype.NamedType('algorithm', univ.ObjectIdentifier()), namedtype.OptionalNamedType('parameters', DSSParameters()) ) class SubjectPublicKeyInfo(univ.Sequence): componentType = namedtype.NamedTypes( namedtype.NamedType('algorithm', AlgorithmIdentifier()), namedtype.NamedType('subjectPublicKey', univ.BitString()), ) class DSAPublicKey(univ.Integer): pass dss_parameters = DSSParameters() dss_parameters.setComponentByName('p', p) dss_parameters.setComponentByName('q', q) dss_parameters.setComponentByName('g', g) algorithm_identifier = AlgorithmIdentifier() algorithm_identifier.setComponentByName('algorithm', univ.ObjectIdentifier((1, 2, 840, 10040, 4, 1))) algorithm_identifier.setComponentByName('parameters', dss_parameters) subject_public_key_info = SubjectPublicKeyInfo() subject_public_key_info.setComponentByName('algorithm', algorithm_identifier) subject_public_key_info.setComponentByName('subjectPublicKey', _a2bits(encoder.encode(DSAPublicKey(y)))) der = encoder.encode(subject_public_key_info) return '-----BEGIN PUBLIC KEY-----\n' + base64.encodestring(der) + '-----END PUBLIC KEY-----\n' p = 8652574980431835801046702501319893323628737876463029580298337449414347224525946403948627650414713523236662848134622261400464992784181209952478362597409469 q = 1102869237300951505579173947124947290564874845679 g = 4112516799587510153843416910187202701228216851472313407150913894984801048587575223178182928872781591943506026197710239402382269043796703824161282824797865 y = 2998329614411012012383616762831086330705701157164243056626309777500058049666595469116052965199021788182564677073758748878456479902088304265763443201269078 pem = _make_dsa_pubkey_pem(p, q, g, y) bio = M2Crypto.BIO.MemoryBuffer(pem) dsapub = M2Crypto.DSA.load_pub_key_bio(bio) 

Я закончил создание патча, который добавляет фабричный метод pub_key_from_params для M2Crypto и включает в себя регрессионные тесты в дополнение к функциональности. Состояние запроса функции по-прежнему «NEW» на момент публикации: https://bugzilla.osafoundation.org/show_bug.cgi?id=12981 . Он работал для меня последние несколько месяцев. Если разработчики считают это полезным, возможно, он будет включен.

Есть много заводских функций в модуле DSA за пределами get_params , и я думаю, что вы хотите загрузить load_pub_key (если у вас есть открытый ключ и параметры в файле PEM) или load_pub (если они у вас есть в объекте BIO). См. Также модуль BIO для различных видов объектов BIO.

  • M2Crypto Шифрование / Расшифровка с использованием AES256
  • _shutdown AttributeError (игнорируется) при использовании кода Linting, который использует M2Crypto
  • Как использовать m2crypto для проверки цепочки сертификатов X509 в настройке без SSL
  • Где я должен хранить файлы M2Crypto
  • В чем разница между параметрами set_client_CA_list_from_file () и M2Crypto и load_verify_info (), и когда вы будете использовать их?
  • Как использовать .pem-файл с Python M2Crypto
  • Установка M2Crypto на CentOS
  • Подтвердить подпись с помощью pyopenssl
  • Python - лучший язык программирования в мире.