【问题标题】:How to get back a signed string (e.g. md5 hash) using a public-key (x509 certificate)如何使用公钥(x509 证书)取回签名字符串(例如 md5 哈希)
【发布时间】:2011-08-26 15:05:00
【问题描述】:

我是密码学的新手,在这个问题上卡了 2 天,希望你能帮助我。

我尝试使用 X509 证书的私钥对 md5 摘要字符串进行签名。据我所知,这很好用。 现在我尝试使用该 x509 证书的公钥取回该字符串,但我不知道该怎么做。

首先我使用 OpenSSL 创建了一个 x509 证书和一个私有密钥文件:

openssl req -newkey rsa:1024 -nodes -x509 -days 365 -out signer.pem

这是我尝试过的示例代码:

import M2Crypto
import hashlib

def empty_callback ():
 return

# md5 hash of params
params = "0045KIABCDEFG"

m = hashlib.md5()
m.update(params)
md = m.digest()
print m.hexdigest()

M2Crypto.Rand.rand_seed (os.urandom (1024))

# sign md5 hash with private key
SignEVP = M2Crypto.EVP.load_key ('privkey.pem')
#Begin signing
SignEVP.sign_init ()
#Tell it to sign our string
SignEVP.sign_update (md)
#Get the final result
StringSignature = SignEVP.sign_final ()
#print the final result
print StringSignature.encode ('base64')

我用这个得到了公钥,但不知道如何使用它。

objX509 = M2Crypto.X509.load_cert ('signer.pem') PubKey = objX509.get_pubkey()

我只找到了如何验证签名字符串,但这不是我需要的。 有没有使用signer.pem(公钥)取回原始md5摘要(md)的方法?

我正在使用 M2Cyrpto-0.21.1 和 OpenSSL 1.0.0d,并在 Windows7 上使用 Python27、32 位进行编程。

亲切的问候, 法尔科

【问题讨论】:

  • 从技术上讲,您不应该“解密”签名。你想做什么?如果要验证签名,可以通过其他方式完成。

标签: python m2crypto


【解决方案1】:

从技术上讲,您不应该“解密”签名。如果您真的想解密它,请执行以下操作:

cert = X509.load_cert("signer.pem")
decrypted = cert.get_pubkey().get_rsa().public_decrypt(StringSignature, 1)

但这不会给你你所期望的,我猜。

如果要提取使用上述代码签名的消息摘要,则必须解码 decrypted 中的 ASN.1 序列。当然,你可以使用 PyCrypto 来做到这一点,但有什么用呢?

from Crypto.Util import asn1
seq = asn1.DerSequence()
seq.decode(decrypted)
obj = asn1.DerObject()
obj.decode(seq[1])
# now this is the original message digest that was signed
original_message_md = obj.payload

【讨论】:

  • 感谢您的快速回复。
  • 我尝试编写一个 Webserver-App 处理基于文档的签名 URL。在本文档中,他们总是说“签名” URL,但同时我认为他们的意思是加密 URL。所以第一个解决方案对我来说很好。谢谢...
猜你喜欢
  • 2018-07-19
  • 2021-02-17
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2019-03-04
相关资源
最近更新 更多