【发布时间】:2018-07-21 10:51:22
【问题描述】:
我正在使用 python 和 cryptography.io 来签署和验证消息。我可以通过以下方式获得签名的 DER 编码字节表示:
cryptography_priv_key.sign(message, hash_function)
...根据本文档:https://cryptography.io/en/latest/hazmat/primitives/asymmetric/ec/
来自 256 位曲线的 DER 编码 ECDSA 签名最多为 72 个字节;见:ECDSA signature length
但是,根据 r 和 s 的值,它也可以是 70 或 71 字节。事实上,如果我检查这个函数的输出长度,它会在 70-72 之间变化。到目前为止我有这个权利吗?
我可以将签名解码为整数 r 和 s。这些显然都是 32 字节,但我不清楚这是否会总是如此。
将这两个整数转换为字节并通过网络发送它们是否安全,以便在另一端再次对其进行编码?
【问题讨论】:
-
对于 ASN.1/DER 编码,
r和s是INTEGER,这是一个二进制补码整数。如果设置了高位,则在前面添加一个前导 0 字节以保持整数为正。知道您是否需要r或s的额外八位字节的唯一方法是签署消息。处理它的正确方法是让签名函数返回一个大小合适的缓冲区。 -
为什么不直接发送
sign()给你的正确的DER编码序列? -
@JamesKPolk:DER 编码的序列不是固定长度的。
-
发送可变字节数并不是一个难题。如果可能,最好避免在 DER 编码中间解析 ASN.1
INTEGER组件。我宁愿遇到发送和接收可变字节数的问题,也不愿遇到 ASN.1 解析问题。 -
@JamesKPolk:为什么最好避免?您是否有描述“ASN.1 解析问题”的链接?
标签: cryptography ecdsa python-cryptography