2

我想用命令创建一个像 openssl 这样的 .tsq 文件:

openssl ts -query -data <file>-no_nonce -sha512 -out<out.tsq>

我想用python实现这个,任何人都知道如何做到这一点,任何模块或类似的东西?

4

3 回答 3

2

现在我可以想到三种不同的方法:

  1. 使用一些未知质量的预制python模块,例如@JFSebastian在他的评论中提到的python-rfc3161 。
  2. 使用hashlib 模块计算您想要时间戳的数据的 SHA512 哈希,然后使用pyasn1 模块构造和编码RFC3161TimeStampReq中定义的请求结构。
  3. 使用hashlib 模块计算您想要时间戳的数据的 SHA512 哈希,并将这些字节预先附加0x30 0x56 0x02 0x01 0x01 0x30 0x51 0x30 0x0D 0x06 0x09 0x60 0x86 0x48 0x01 0x65 0x03 0x04 0x02 0x03 0x05 0x00 0x04 0x40到哈希值。这应该对您有用,因为您提供的 OpenSSL 命令正在创建不包含任何可变部分(例如 nonce 或策略 OID)的 TS 请求,因此无论您将使用什么输入数据,请求结构的第一部分都不会改变。
于 2015-02-05T19:30:38.487 回答
1

这是@jariq 回答中第三个想法的 Python 3 实现:

#!/usr/bin/env python3
"""Emulate `openssl ts -query -data <file> -no_nonce -sha512 -out <out.tsq>`

   Usage: %(prog)s <file> [<out.tsq>]

If <out.tsq> is not given; use <file> name and append '.tsq' suffix
"""
import hashlib
import sys
from functools import partial

def hash_file(filename, hashtype, chunksize=2**15, bufsize=-1):
    h = hashtype()
    with open(filename, 'rb', bufsize) as file:
        for chunk in iter(partial(file.read, chunksize), b''):
            h.update(chunk)
    return h

try: # parse command-line arguments
    filename, *out_filename = sys.argv[1:]
    out_filename.append(filename + '.tsq')
except ValueError:
    sys.exit(__doc__ % dict(prog=sys.argv[0]))

h = hash_file(filename, hashlib.sha512) # find hash of the input file
with open(out_filename[0], 'wb') as file: # write timestamp query
    file.write(b'0V\x02\x01\x010Q0\r\x06\t`\x86H\x01'
               b'e\x03\x04\x02\x03\x05\x00\x04@')
    file.write(h.digest())
于 2015-02-06T19:25:32.600 回答
0

要扩展@jf-sebastian 的答案,如果要使用 sha-256(或任何 256 位哈希函数)进行哈希,请使用以下常量:

b'06\x02\x01\x01010\r\x06\t`\x86H\x01e\x03\x04\x02\x01\x05\x00\x04 '

(是的,最后一个字符是空格)

于 2017-07-21T18:18:17.463 回答