获取 ECDSA 签名的固定长度字节表示的正确方法是什么?

What's the proper way to get a fixed-length bytes representation of an ECDSA Signature?

我正在使用 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 字节,但我不清楚是否会 总是 如此。

将这两个整数转换为字节并通过网络发送它们是否安全,目的是在另一端再次对它们进行编码?

简单的回答是,是的,它们总是 32 字节。

更完整的答案是,它取决于曲线。例如,256 位曲线的阶数为 256 位。同样,一条128位的曲线只有128位的阶。

您可以将此数字除以八,得到 rs 的大小。

当曲线不能被 8 整除时,它会变得更加复杂,例如 secp521r1,其中顺序是 521 位数字。

在这种情况下,我们四舍五入。 521 / 8 是 65.125,因此它需要我们释放 66 字节的内存来适应这个数字。

通过网络发送它们并再次编码是安全的,只要您记住哪个是 rs