阅读509证书的公钥,发现一个字节不明白是什么含义,帮忙看看!

pale 2005-03-17 05:16:05
我从IE中导出了一个证书文件,根据ASN1格式以及BER编码的介绍依次读出这个证书文件的数据,可发现在公钥数据的地方有一个字节不明白是什么含义,放在这里有什么用,希望哪位大侠帮忙看看!
我分解出公钥数据部分如下所示:
03 81 8d 00 30 81 89 02 81 81 00 e0 4e 10 0e b8
a7 ef 21 ca 60 5a dc 9f 1e 3e 83 77 5a 29 2e f9
4e e5 08 5d de e1 cf 09 c0 1f 44 b7 07 a8 4b a4
22 30 3b 19 06 83 ee f3 ac 27 78 ae ca d6 40 2b
ce 79 01 e1 9d 56 8b 36 72 b1 63 90 5f a0 b2 c0
66 a6 49 c5 3c fa 26 a2 62 c3 d3 b5 cc 61 15 4c
f2 3f b4 e7 45 08 43 89 7f 6a 8d d5 66 fb d7 ff
64 00 c4 11 fd 2c a3 0b 75 b0 fb e5 ac 26 65 a3
81 e6 66 49 3d 1d 73 7a 9b 71 d7 02 03 01 00 01
03表明它是一个OCTET STRING格式的数据,81代表长格式,8d代表数据长度
下来那个00是什么含义呢?
接下来30代表SEQUENCE,81代表长格式,89代表数据长度
然后02代表BIT STRING 格式的数据,在这里实际上是RSA公钥数据的合数模n,可它的长度是81???
我看了这个证书密钥是1024位的,也就是说它的长度用十六进制表示应该是80,可确实不明白这里为什么是81,而且多的这一个字节就是紧跟在长度后面的第一个字节的数据00

我导出了好多个证书来观察,发现结果都是一样,对于合数模n,给出的长度,都比实际多1,而且都是00
这是怎么回事?
有谁能帮帮我呢?谢谢了
...全文
232 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
CALayman 2005-03-24
  • 打赏
  • 举报
回复
To pale:
X.690是BER、DER编码的标准,你查一下就知道了。在ITU的网站有Prepublished version下载。
http://www.itu.int/ITU-T/studygroups/com17/languages/
pale 2005-03-23
  • 打赏
  • 举报
回复
楼上的,我觉得你第一种说法有问题,长格式第一个字符为1就已经表明了它是一个长格式,后面的7位表示的数据代表长度表示的字节数,那么81说明后面的一个字节是用来表示长度的
至于第二种说法我再仔细看看,到现在为止还不是很明白
不过非常感谢你的帮助 ,谢谢
pale 2005-03-23
  • 打赏
  • 举报
回复
CALayman:
照你说的那个第一个00是表示未使用的位,那么也就是有不为0的时候了,如果不为0,假设01表示未使用的位为1,那这个1位又代表哪一位呢?
再一个请问在哪个文件中做了这样的定义或说明?
不好意思,我现在是要写分析文档,必须注明一个说法的来源
我想知道在哪个标准里做了这样的定义?包括后面那个e0前面的00,是在哪里定义了如果最高位为1就必须在前面加00这样的做法?
谢谢!
jingrunx 2005-03-23
  • 打赏
  • 举报
回复
楼上的应该没问题,我上面的第一个解释是错误的,第二个忘了否定。
CALayman 2005-03-23
  • 打赏
  • 举报
回复
03表示bitstring,81表示后面的一个字节表示长度,8d表示长度。
00表示未使用的位为0位。
30表示SEQUENCE,81 89表示长度为89。
02表示整数,81 81表示长度为81。后面0x81个字节表示n。
由于n为正整数,而e0最高位为1,所以要加00
02 表示整数,03表示长度 01 00 01为e的值,即e=65537
pale 2005-03-21
  • 打赏
  • 举报
回复
我就是看了asn1的描述之后对应一个公钥文件分析,才发现这一个字节不明白是什么意思的
有谁能给解释一下吗?
就这一个字节,我找不到他所代表的含义
jingrunx 2005-03-21
  • 打赏
  • 举报
回复
我跟踪openssl中的a_bitstr.c

发现
p= *pp;
i= *(p++);
/* We do this to preserve the settings. If we modify
* the settings, via the _set_bit function, we will recalculate
* on output */
ret->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); /* clear */
ret->flags|=(ASN1_STRING_FLAG_BITS_LEFT|(i&0x07)); /* set */

其中的i就是你所说的那个0,看样子那是串的一个什么标记
这是这个标记的定义,看对你有没有帮助:
#define ASN1_STRING_FLAG_BITS_LEFT 0x08 /* Set if 0x07 has bits left value */

jingrunx 2005-03-21
  • 打赏
  • 举报
回复
可能这样解释:81代表长格式,0089代表数据长度,长度由两位来表示。
morefaster 2005-03-19
  • 打赏
  • 举报
回复
你看看asn1的语法描述吧。
里面有der编码规范,看了你就明白了。
pale 2005-03-18
  • 打赏
  • 举报
回复
我又仔细看了看,楼上的解释是不是这个意思,因为那个合数模n的第一个字节的最高位为1,所以为了将它与负数相区分,在前面加一个00来表示它是正整数?
我看了一些私钥文件,有时CRT系数或是p,q前面也不定的加上00是不是也是这个原因?
这样解释就通了,但是我想知道这种使用的方法在哪里有具体的定义?

另一个问题就是前面8d后面的那个00又代表了什么含义呢?这个00只在公钥文件中出现,对于私钥文件,前面是没有这个00的,这是为什么呢?
pale 2005-03-18
  • 打赏
  • 举报
回复
谢谢楼上的回答
可你说的在前面补0,在哪个前面?表示哪个是正整数?具体应该怎么解释?
我现在不明白的地方是两个都出现一个00,且根据ASN1和PKCS的语法都无法解释
谢谢了
jingrunx 2005-03-17
  • 打赏
  • 举报
回复
整数的高位为1表示是负数,因此在前面补0表示这是个正整数。
证书的体系架构当中,包括了四个基本的组件,分别是密钥与加密算法,证书证书颁发机构,证书申请、续订和吊销的通道,以及使用证书的应用程序 密钥与加密算法,就能够将明文信息,转化成为密文信息,以确保在网络当中传输时信息的安全,它主要分为两种类型,一种是对称加密算法,加密和解密时使用的都是同样的密钥和算法,一般用于加密数据,另外的一种是非对称加密算法,它包括了一对加密密钥,分别是公钥和私钥,如果公钥用于加密明文成为密文,那么私钥将用于解密密文到明文,公钥可以在网络当中进行传输,私钥不在网络当中传输 一般来说,如果两台计算机之间要传输数据,首先将由发送方计算机通过对称加密完成数据的加密过程,然后再由接收方计算机通过网络传输公钥给发送方,发送方再使用公钥加密对称加密的密钥,并且与加密的数据一起发送给接收方计算机,接收方计算机再使用私钥解密出对称加密的密钥,再使用密钥解密加密的数据,完成数据安全传输的过程 而反过来,如果接收方使用私钥加密一个文件,再通过网络将加密文件、公钥和明文一起发送给发送方,发送方使用公钥解密了文件,与一起接收的明文对比,如果相同,就能证明文件未进行修改,实现签名的功能 而证书,就是加密密钥和算法的载体,一张证书当中,包括了加密密钥,算法,签名等信息,并且对于证书申请、颁发、续订和吊销的整个生命周期,还包括了很多其它的一些属性,应用程序可以通过读取证书的这些信息,完成数据的加密解密,签名和身份验证等不同的应用场景 而证书颁发机构,将负责的证书的整个生命周期管理,证书颁发机构是一个层次化的体系结构,根证书颁发机构将只负责子证书颁发机构的证书颁发和吊销管理,子证书颁发机构将负责应用程序证书的申请请求和管理,根证书颁发机构可以放置在一个隔离的环境当中,进一步增强整个证书链的安全,而子证书颁发机构可以按照需求进行扩展,满足不同规模的应用要求 在我们的课程当中,将按照此最佳实践,完成证书服务当中,不同组件的安装和配置

4,450

社区成员

发帖
与我相关
我的任务
社区描述
云计算 云安全相关讨论
社区管理员
  • 云安全社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧