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

标签 cryptography ecdsa python-cryptography

我正在使用 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 位的阶数。

您可以将此数字除以 8 以求出 r 的大小。和 s .

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

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

只要您跟踪哪个是 r,就可以安全地通过网络发送它们并再次对它们进行编码。和 s .

关于cryptography - 获得 ECDSA 签名的固定长度字节表示的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48726642/

相关文章:

python - 如何使用golang使用ecdsa私钥对消息进行签名?

java - 无法使用 WebCrypto 验证 ECDSA 签名

python - 错误: Could not build wheels for cryptography which use PEP 517 and cannot be installed directly

python - 如何找到 EC key python-cryptography 的 ASN.1 组件

python - 在 Python 中使用 SHA256 对字节字符串进行签名

cryptography - 什么是 RSA "key ID"?

python - 使用 Crypto 打印 RSA 解密的字节字符串?

c++ - ECDSA 使用 OpenSSL 签名,使用 Crypto++ 验证

Java AES 解密得到解密的十六进制而不是解密的字符串

c# - key 容器到底是什么?它位于哪里?