【问题标题】:Using pycrypto PKCS#7 to create a signature使用 pycrypto PKCS#7 创建签名
【发布时间】:2013-04-29 17:00:25
【问题描述】:

我正在查看 PassBook 的 Apple 文档,我需要:

  • 创建“清单文件的 PKCS #7 分离签名”。

理想情况下,我希望使用 Python 来执行此操作,并且理想情况下我希望使用 pycrypto 来完成这项任务,但问题是,我在网上找不到任何关于如何执行此操作的示例代码,有很多代码如下:

from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA

message = 'To be encrypted'
h = SHA.new(message)

key = RSA.importKey(open('pubkey.der').read())
cipher = PKCS1_v1_5.new(key)
ciphertext = cipher.encrypt(message+h.digest())

但对 PKCS#7 的细节了解不够,我不知道我需要做什么......

有人有什么想法吗?

谢谢

【问题讨论】:

  • 这已经有几年了,你有没有找到解决办法?

标签: python pkcs#7


【解决方案1】:

this answer 的大力帮助下,我做到了!

我知道 op 可能已经超越了这个,但是这个答案在互联网上没有,所以这是解决方案,为了后代!

from OpenSSL import crypto

with open(cert) as cert_file:
    cert_buf = cert_file.read()

with open(key) as key_file:
    key_buf = key_file.read()

pkey = crypto.load_privatekey(crypto.FILETYPE_PEM, key_buf)
signcert = crypto.load_certificate(crypto.FILETYPE_PEM, cert_buf)

bio_in = crypto._new_mem_buf(text.encode())
PKCS7_NOSIGS = 0x4  # defined in pkcs7.h
pkcs7 = crypto._lib.PKCS7_sign(signcert._x509, pkey._pkey, crypto._ffi.NULL, bio_in, PKCS7_NOSIGS)  # noqa
bio_out = crypto._new_mem_buf()
crypto._lib.i2d_PKCS7_bio(bio_out, pkcs7)
sigbytes = crypto._bio_to_string(bio_out)

请记住,它使用了一些未记录的 pyopenssl 函数。

【讨论】:

  • 我正在尝试应用此解决方案,但证书应该采用 .pem 格式,并键入 .p12 格式。这是解决此问题的另一种方法吗?不需要一起使用 .p12 文件并对原始 .der 文件进行操作,或者我对此解决方案一无所知?
  • 我的密钥和证书都是 PEM 格式。您可以根据需要将参数更改为 load_certificateload_privatekey。如果适合您,您也可以将它们转换为这种格式。
【解决方案2】:

这对我有用,我试图为 NSDL 签名一个字符串,

from OpenSSL import crypto
import base64
try:
    p12 = crypto.load_pkcs12(open("/DSCPFX.pfx", 'rb').read(), "XXXX")
    # print("p12 : ", p12)
    signcert = p12.get_certificate()
    pkey = p12.get_privatekey()

    text = "This is the text to be signed"
    bio_in = crypto._new_mem_buf(text.encode())
    PKCS7_NOSIGS = 0x4
    pkcs7 = crypto._lib.PKCS7_sign(signcert._x509, pkey._pkey, crypto._ffi.NULL, bio_in, PKCS7_NOSIGS)
    bio_out = crypto._new_mem_buf()
    crypto._lib.i2d_PKCS7_bio(bio_out, pkcs7)

    sigbytes = crypto._bio_to_string(bio_out)

    signed_data = base64.b64encode(sigbytes)
    return SUCCESS, signed_data
except Exception as err:
    print("Exception happens in sign_data and error is: ", err)
    return 0, str(err)

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多