使用 asn.1 编码大整数时的奇怪之处



我在ASN.1中发现了许多对整数编码要求的引用。并且整数本质上是有符号的对象

TLV 02 02 0123 例如。

但是,我编码了一个 256 位整数(在证书内)30 82 01 09 02 82 01 00 d1 a5 xx xx xx... 02 03 010001

30 开始82 2 字节长度0109 265 字节

02 整数82 2 字节长度0100 256 字节D1 A5 xxxx

d1 是令人不安的部分,因为前导位是 1,这意味着这个 256 位数字是有符号的,而实际上它是一个无符号的数字,一个公共的 rsa 密钥。 有符号约束是否适用于 64 位>整数?

谢谢

BER/DER 使用 2s 补码表示来编码整数值。 这意味着第一位(不是字节)确定数字是正数还是负数。 这意味着有时需要添加一个额外的前导零字节,以防止第一个位导致整数被解释为负数。 请注意,将前 9 位全部为零是无效的 BER/DER。

是的,你是对的。对于任何非负 DER/BER 编码INTEGER(无论其长度如何),第一个有效负载字节的 MSB 为 0。

生成此类密钥的程序不正确。

"有符号约束"(实际上是规则)完全适用于任何大小的整数。但是,根据域的不同,您可能会发现域对象的编码方式存在各种奇怪之处。不幸的是,这是必须学习和解释的艰难方式。

最新更新