首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在给定参数和键值的情况下创建M2Crypto DSA对象?

如何在给定参数和键值的情况下创建M2Crypto DSA对象?
EN

Stack Overflow用户
提问于 2010-06-12 10:07:28
回答 3查看 801关注 0票数 2

使用M2Crypto,我想创建一个DSA_pub对象来验证DSA签名。我知道q、p、g和公钥,但我知道实例化DSA对象的唯一方法是使用:

代码语言:javascript
复制
dsa = DSA.set_params(q,p,g)
dsa.gen_key()

如何分配已知的公钥?

EN

回答 3

Stack Overflow用户

发布于 2011-01-04 04:17:40

我刚刚遇到了这个挑战,我有P、Q、G和Y参数(在我的例子中来自一个XML文档),但是M2Crypto没有办法从它们创建有效的公钥。

我求助于使用pyasn1生成一个PEM公钥字符串,然后使用M2Crypto.DSA.load_pub_key_bio工厂函数加载该PEM公钥。

我的粗略代码如下,以防将来对某些人有用。

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2011-01-04 13:06:56

我最终创建了一个补丁,它为M2Crypto添加了一个pub_key_from_params工厂方法,除了功能之外,还包括回归测试。在这篇文章的时候,功能请求的状态仍然是“新的”:https://bugzilla.osafoundation.org/show_bug.cgi?id=12981。在过去的几个月里,它对我很有效。如果开发人员发现它很有用,可能会将其包括在内。

票数 1
EN

Stack Overflow用户

发布于 2010-06-12 10:31:37

除了get_params之外,模块DSA中还有许多工厂函数,我认为你需要load_pub_key (如果你在PEM文件中有公钥和参数)或load_pub (如果你在BIO对象中有它们)。另请参阅各种BIO对象的BIO模块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3027196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档