为什么同一份RSA公钥分别显示为十六进制数值和字母字符串?
两种OpenSSL公钥输出形式的差异原因
两个命令提取的是同一份RSA公钥的核心数据,只是输出规则完全不同,具体原因如下:
openssl x509 -in server.crt -text的输出逻辑-text参数的作用是把证书的所有结构化内容转译为人类可读的明文形式,RSA公钥的核心组成部分Modulus(模数)本质是超大二进制整数,为了方便人工核对,命令直接将其转换为十六进制字符串,并用冒号做分段处理。- 注意该输出是把公钥拆分字段展示,除了Modulus之外,公钥的另一个核心组成部分Public Exponent(公开指数,常见值为65537即0x10001)也会在同一块区域单独展示,两个字段组合才是完整的RSA公钥原始数据。
openssl x509 -in server.crt -pubkey -noout的输出逻辑-pubkey参数的作用是输出标准结构化格式的完整公钥内容,遵循PEM(Privacy Enhanced Mail)编码规范,生成过程为:- 先将完整的RSA公钥(包含Modulus和Public Exponent)按照ASN.1标准做结构化二进制编码,得到DER格式公钥数据
- 再将DER二进制数据做Base64编码,转换为由大小写字母、数字、
+///=符号组成的可打印字符串 - 最后在首尾加上
-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----的固定标识头尾,得到最终的PEM格式公钥。这种格式的设计目标是方便在文本协议、配置文件中传输、存储完整公钥,不需要依赖二进制传输能力。
如果你需要验证二者对应同一份公钥,可以把PEM格式公钥保存为pub.pem文件,执行openssl rsa -pubin -in pub.pem -text -noout,输出的Modulus值和证书-text输出的冒号分隔十六进制值完全一致。
内容的提问来源于stack exchange,提问作者Mohammad Kholghi
相关产品推荐
相关产品推荐

