gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:59 25 4
gpt4 key购买 nike

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

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

如何分配已知的公钥?

最佳答案

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

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

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

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)

关于python - 如何在给定参数和键值的情况下创建 M2Crypto DSA 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3027196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com