我正在使用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之间变化。到目前为止,我有这个权利吗?
我可以将签名解码为ints r和s。这些都显然是32个字节,但我不清楚是否总是是这样。
将这两个整数转换为字节并通过网络发送它们是否安全,并打算在另一方再次编码它们?
答案 0 :(得分:2)
简单的答案是,是的,它们总是32个字节。
更完整的答案是它取决于曲线。例如,256位曲线具有256位的量级。类似地,128位曲线只有128位的数量级。
您可以将此数字除以8,以查找r
和s
的尺寸。
当曲线不能被8整除时会变得更复杂,例如secp521r1,其中的顺序是521位数。
在这种情况下,我们会围捕。 521/8是65.125,因此它要求我们释放66个字节的内存来适应这个数字。
只要您跟踪r
和s
,就可以安全地通过电线发送并再次编码。