【问题标题】:Duplicate 'openssl rsautl' verification in Python在 Python 中重复“openssl rsautl”验证
【发布时间】:2017-08-31 11:34:43
【问题描述】:

我在 bash 中这样做:

head -c 128 <signed_fw_image> > <image_sign>

openssl rsautl -verify -inkey <public_rsa_key> -in <image_sign> -pubin > <out_sign_result>
md5sum <raw_image_bin> | xxd -r -p > <out_orig_result>
diff <out_sign_result> <out_orig_result>

如何在 python 中实现这一点,我应该使用哪些库?

【问题讨论】:

  • 你有没有尝试过什么?有什么研究吗?阅读任何文档?
  • 我当然会做一些研究。例如,我们在 python、Crypto 库中有 openssl 实现。例如,我试过这个stackoverflow.com/questions/12146985/… 所以,我决定问这个。也许有人以前这样做过,可以帮助我。我从 2008 年开始阅读 stackoverflow,它对我有很大帮助。但现在我很怀疑,这是我的第一个问题。
  • 您使用链接的 SO QA 获得了哪些结果 - 似乎是正确的方法?
  • 也许你应该看看rsautil 子命令的源代码。您可以在&lt;openssl dir&gt;/apps/rsautil.c 找到它。它是更容易解析和理解的子命令之一。
  • 谢谢!我已经考虑过您的解决方案,但现在我将尝试使用子进程并从 rsautil 的标准输出中捕获字节。

标签: python bash rsa pyopenssl


【解决方案1】:

我最近遇到了类似的问题,我在最终阅读rsautl 源代码的途中来到这里。它只执行一个原始 RSA 回合。以下 Python 3 脚本可用于重现 rsautl -verify 的行为,并依赖于我推荐用于此任务的 pycryptodome 包:

# emulates the command: openssl rsautl -verify -pubin -inkey $1

import sys
import re
from Crypto.PublicKey import RSA

with open(sys.argv[1], 'rb') as keyfile:
    key = RSA.import_key(keyfile.read())

msg = sys.stdin.buffer.read()
assert len(msg) <= key.size_in_bytes(), 'block too large.'

msg = int.from_bytes(msg, byteorder='big')

# RSA happens here:
dec = pow(msg, key.e, key.n)

dec = dec.to_bytes(key.size_in_bytes(), byteorder='big')
dec = re.match(BR'^\x00\x01\xFF+\x00(.*)$', dec, flags=re.DOTALL)
assert dec, 'output format invalid'

sys.stdout.buffer.write(dec.group(1))

我认为这是棘手的部分,您可以使用内置的 hashlib 模块计算文件的 MD5 校验和。

【讨论】:

    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多