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

Encoding 使用asn.1编码大整数时的奇怪之处,encoding,asn.1,Encoding,Asn.1,我在ASN.1中找到了许多关于整数编码要求的参考资料 整数本质上是有符号的对象 exmaple的TLV 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位的数字是有符号的,而实际上它是一个无符号数字,实际上

我在ASN.1中找到了许多关于整数编码要求的参考资料 整数本质上是有符号的对象

exmaple的TLV 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位的整数


谢谢,

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


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

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

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

是的,这是错误的,但在实际证书中太常见了。