使用 asn.1 编码大整数时的奇怪之处
Posted
技术标签:
【中文标题】使用 asn.1 编码大整数时的奇怪之处【英文标题】:Oddity when encoding large integers using asn.1 【发布时间】:2012-10-12 13:32:39 【问题描述】:我发现很多关于 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 位的整数?
谢谢,
【问题讨论】:
是的,这是错误的,但在实际证书中太常见了。 【参考方案1】:BER/DER 使用 2s 补码表示来编码整数值。这意味着第一位(不是字节)确定一个数字是正数还是负数。这意味着有时需要添加一个额外的前导零字节以防止第一位导致整数被解释为负数。请注意,前 9 位全为零是无效的 BER/DER。
【讨论】:
【参考方案2】:是的,你是对的。对于任何非负 DER/BER 编码的INTEGER
- 无论其长度如何 - 第一个有效负载字节的 MSB 为 0。
生成此密钥的程序不正确。
【讨论】:
【参考方案3】:“有符号约束”(实际上是一条规则)完全适用于任何大小的整数。但是,根据域的不同,您可能会在域对象的编码方式中发现各种奇怪之处。不幸的是,这是必须学习和解释的东西。
【讨论】:
以上是关于使用 asn.1 编码大整数时的奇怪之处的主要内容,如果未能解决你的问题,请参考以下文章