`
zscomehuyue
  • 浏览: 411919 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

PEM文件格式详细解析 收藏

阅读更多
PEM文件格式详细解析 收藏

PEM文件格式存档

Author:Roson sun sunxiao@tomonline-inc.com

Time:2006-4-11

1.  描述:

Openssl使用PEM(RFC 1421-1424)文档格式,如果使用其他语言包,则需要将此格式进行解码并将各个私公钥加入。

2.  说明:

a)         首先使用BASE64解码,如果是非ANSI TXT格式,需要做转换。

b)        一个RSA私钥包含一下信息(1024位):

>openssl rsa -in key.pem -noout -text

modulus:

00:d5:00:b2:18:c3:04:d1:ac:80:c6:22:a0:cc:5c:

f1:c0:4a:83:95:e5:c9:88:ae:31:64:ab:e1:15:42:

de:1a:da:bc:f5:d2:05:05:74:9d:d3:86:94:9b:9d:

74:bb:e5:72:a4:b8:40:27:61:88:d4:ac:20:b0:2b:

1c:1e:d7:9b:43:c5:06:b6:3a:b4:42:f0:5a:22:38:

23:74:99:4a:50:f1:f1:54:11:5a:44:0b:40:cf:83:

8a:73:6c:34:15:98:0a:7d:cf:0e:e5:00:8d:07:40:

f7:7d:fb:3f:64:35:1b:5d:a3:40:a9:51:fa:92:7d:

34:ef:03:fe:e0:59:56:31:25                 

数量:128



publicExponent:

01:00:01

数量:3



privateExponent:

11:e2:a8:11:ba:36:6a:60:c0:c3:62:5e:fc:2a:05:          

c6:ae:bb:13:d8:22:af:0e:69:69:59:a1:61:c6:a6:          

9d:bc:a6:47:41:e6:58:09:ed:c2:b8:37:3c:45:e1:          

6a:71:9e:c9:c4:0a:e7:03:a2:98:b1:07:61:a3:8d:          

0d:ed:ee:c4:7f:ca:fe:7d:c1:2e:2f:ca:3d:16:81:           

4f:bf:ad:6a:03:ca:d7:80:dc:57:03:fe:cf:1f:37:          

05:8d:58:79:14:01:1f:66:42:e4:f1:b6:9d:f1:01:          

37:12:f4:d8:15:c0:cc:9b:fc:ea:55:cb:2f:ba:46:          

fd:17:11:7e:43:b5:d1:15                                

数量:128



prime1:

00:ed:a0:e8:25:cc:1c:aa:f5:44:e2:78:9e:54:2c:

1d:60:cb:8f:32:b3:68:6d:b3:1d:cd:a9:8c:2a:ca:

02:bc:7b:a7:8b:06:1d:fa:af:4f:8c:26:81:54:12:

ec:7d:92:20:77:85:ef:6e:06:a6:8b:9c:eb:ab:6a:

e6:a1:83:6d:a3                             

数量:64(去掉开头的0)



prime2:

00:e5:78:66:5a:84:22:51:78:2d:14:fc:5f:f8:4e:

45:5f:e3:b2:5e:5b:50:a4:f5:55:e0:f3:0e:98:2c:

52:61:c2:50:df:f4:b7:bc:6e:69:3e:99:ff:1c:50:

a8:89:05:7a:2b:25:91:56:a5:a6:8f:8a:ec:80:82:

fa:eb:09:c2:97                             

数量:64(去掉开头的0)



exponent1:

00:89:e6:26:d2:48:71:1a:84:db:44:d1:da:8f:de:

49:ee:32:33:17:a9:25:a1:03:a0:f8:08:bc:5e:d8:

7c:5e:05:24:65:79:57:4c:73:10:26:b4:f1:b8:68:

82:f5:1c:27:db:34:ce:8d:7b:2e:8b:36:b5:4c:f4:

ec:82:2e:53:21                             

数量:64(去掉开头的0)



exponent2:

6a:16:a6:e3:74:31:55:8f:04:f0:ad:d9:44:b8:13:

14:c8:f5:5e:f0:42:b1:71:07:5a:2f:a4:f0:af:95:

0a:c3:46:96:b3:d1:fa:58:e5:69:5e:d2:f5:e9:48:

71:c8:c9:79:87:2d:d1:6c:56:3c:08:d3:5c:7a:b1:

bc:d6:4f:53                                

数量:64



coefficient:

62:dd:3f:f4:c7:30:c7:77:5e:8c:ae:c8:11:c1:23:

b0:6d:7d:07:54:8f:e7:12:1d:e1:00:ad:70:55:12:

43:f6:6f:a9:d7:94:9d:33:15:66:16:2d:d1:76:13:

33:0d:ae:6f:e3:3f:46:4b:4a:78:14:02:2e:72:66:

59:0c:2d:6a                                

数量:64

c)        与C#中RSAParameter结构体对应表:

说明


PEM


RSAParameter




Modulus


modulus




Exponent


Exponent




prime1


P




exponent1


Q




prime2


DP




exponent2


DQ




coefficient


InverseQ




privateExponent


D



d)        PEM偏移(1024位,以0为开始字符,十进制)

说明


PEM私钥


PEM公钥


长度

Modulus


11


29


128

PublicExponent


141


159


3

PrivateExponent


147


×


128

Prime1


278


×


64

Prime2


345


×


64

Exponent1


412


×


64

Exponent2


478


×


64

Coefficient


545


×


64

e)         例子程序(C#):

/// <summary>

         /// 用得到的解码值来得到相应的Parameter(BASE64->RSAParameter)

         /// </summary>

         /// <param name="hashKey">源</param>

/// <param name="type">0私钥1公钥</param>

/// <returns></returns>

public RSAParameters getKeyPara(string hashKey,int type)

         {

              RSAParameters rsaP=new RSAParameters();

              byte[] tmpKeyNoB64=Convert.FromBase64String(hashKey);

              int pemModulus=128;

              int pemPublicExponent=3;

              int pemPrivateExponent=128;

              int pemPrime1=64;

              int pemPrime2=64;

              int pemExponent1=64;

              int pemExponent2=64;

              int pemCoefficient=64;



            

              byte[] arrPemModulus=new byte[128];

              byte[] arrPemPublicExponent=new byte[3];

              byte[] arrPemPrivateExponent=new byte[128];

              byte[] arrPemPrime1=new byte[64];

              byte[] arrPemPrime2=new byte[64];

              byte[] arrPemExponent1=new byte[64];

              byte[] arrPemExponent2=new byte[64];

              byte[] arrPemCoefficient=new byte[64];



              if(type==0)//私钥

              {

                   //Modulus

                   for(int i=0;i<pemModulus;i++)

                   {

                       arrPemModulus[i]=tmpKeyNoB64[11+i];

                   }

                   rsaP.Modulus=arrPemModulus;



                   //PublicExponent

                   for(int i=0;i<pemPublicExponent;i++)

                   {

                       arrPemPublicExponent[i]=tmpKeyNoB64[141+i];

                   }

                   rsaP.Exponent=arrPemPublicExponent;



                   //PrivateExponent

                   for(int i=0;i<pemPrivateExponent;i++)

                   {

                       arrPemPrivateExponent[i]=tmpKeyNoB64[147+i];

                   }

                   rsaP.D=arrPemPrivateExponent;



                   //Prime1

                   for(int i=0;i<pemPrime1;i++)

                  {

                       arrPemPrime1[i]=tmpKeyNoB64[278+i];

                   }

                   rsaP.P=arrPemPrime1;



                   //Prime2

                   for(int i=0;i<pemPrime2;i++)

                   {

                       arrPemPrime2[i]=tmpKeyNoB64[345+i];

                   }

                   rsaP.Q=arrPemPrime2;





                   //Exponent1

                   for(int i=0;i<pemExponent1;i++)

                   {

                       arrPemExponent1[i]=tmpKeyNoB64[412+i];

                   }

                   rsaP.DP=arrPemExponent1;



                   //Exponent2

                   for(int i=0;i<pemExponent2;i++)

                   {

                       arrPemExponent2[i]=tmpKeyNoB64[478+i];

                   }

                   rsaP.DQ=arrPemExponent2;



                   //Coefficient

                   for(int i=0;i<pemCoefficient;i++)

                   {

                       arrPemCoefficient[i]=tmpKeyNoB64[545+i];

                   }

                   rsaP.InverseQ=arrPemCoefficient;

              }

              else//公钥

              {

                   for(int i=0;i<pemModulus;i++)

                   {

                       arrPemModulus[i]=tmpKeyNoB64[29+i];

                   }

                   rsaP.Modulus=arrPemModulus;



                   for(int i=0;i<pemPublicExponent;i++)

                   {

                       arrPemPublicExponent[i]=tmpKeyNoB64[159+i];

                   }

                   rsaP.Exponent=arrPemPublicExponent;



              }



              return rsaP;

         }
分享到:
评论

相关推荐

    C#使用PEM文件RSA加密和解密

    通常C#使用xml格式的密钥文件,不能使用Linux下的公钥和私钥pem文件。而XML格式密钥对文件有移植性问题,在一个电脑上能用的xml密钥对,换一个电脑不一定能使用(需要从pem文件重新转换为xml)。本源码直接使用linux...

    C#使用pem格式的密钥对文件来做RSA加解密接签名和验证签名

    C#使用pem格式的密钥对文件来做RSA加解密接签名和验证签名,这里的pem文件是openssl命令生成的密钥对文件,其中私钥pem文件需要用openssl命令转换成pkcs8格式的pem文件。如果已有pem文件,也可以通过openssl命令转换...

    pk8文件转成pem文件过程.pdf

    在当前信息技术领域,PKCS#8(Public-Key Cryptography Standards 8)与PEM(Privacy Enhanced Mail)是两种常见的文件格式,用于存储加密密钥信息。PKCS#8格式的文件通常以.pk8为扩展名,PEM格式的文件扩展名为.pem...

    openssl中把pem格式转为RSA解析密钥中的参数

    openssl 1.1.1C 中把pem格式的rsa密钥解析出,RSA格式的密钥,然后从RSA密钥中解析出RSA密钥中的,n,d,e,dp,dq等信息;

    验证ssl的证书(pem格式)

    PEM(Privacy Enhanced Mail)格式是一种常见的证书格式,它以Base64编码的方式存储证书内容,并使用`.pem`或`.crt`作为文件扩展名。在本文中,我们将深入探讨如何验证SSL证书,特别是使用PEM格式的证书,以及如何...

    微信支付商户证书rootca.pem文件

    微信支付商户证书cert.zip中的rootca.pem文件。根据微信支付官方的信息:“由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书, 2018年3月6日后, 不再提供CA证书文件(rootca.pem)下载。”

    pem:使用Python轻松解析PEM文件

    pem:轻松解析PEM文件 pem是许可的Python模块,用于解析和拆分,即Base64编码的DER密钥和证书。 它在Python 2.7和3.5+上运行,没有依赖关系,并且不会尝试以任何方式解释证书数据。 它源于从各种证书部署中加载...

    NET使用OpenSSL生成的pem密钥文件

    OpenSSL可以生成各种格式的密钥文件,包括pem格式。 三、.NET如何使用OpenSSL生成的pem密钥文件? 在.NET中,可以使用System.Security.Cryptography命名空间中的RSA类来处理pem密钥文件。首先,需要将pem文件内容...

    苹果公钥文件 AppleRootCA-G3.cer AppleRootCA-G3.pem cem格式 cer格式

    首先,我们来解释一下标题中的两个证书文件格式:`.cer`和`.pem`。它们都是公钥证书的标准格式,但存储方式略有不同。 1. **.cer** 格式:这是微软定义的一种证书格式,基于Base64编码的X.509证书,通常用于Windows...

    如何使用密钥管理库导入PEM格式的证书1

    在本文中,我们将详细介绍如何使用密钥管理库导入PEM格式的证书,并解决在上传PEM格式证书时可能遇到的问题。 密钥管理库是Azure提供的一种服务,允许用户保护和控制云应用程序和服务使用的加密密钥和其他机密。...

    cacert.pem文件

    cacert.pem文件

    用OpenSSL把二进制的Cer证书转换程Base64格式的PEM格式的证书.docx

    本文将详细介绍如何使用OpenSSL工具将二进制的CER证书转换为Base64编码的PEM格式。 首先,了解OpenSSL:OpenSSL是一个强大的安全套接字层密码库,包含了各种主要的密码算法、常用的密钥和证书封装管理功能以及SSL...

    .net DSA加密(C#读取OPENSSL生成的DSA的pem文件的秘钥)

    在本资源中,我们关注的是如何使用C#来处理OpenSSL生成的PEM格式的DSA密钥。PEM(Privacy Enhanced Mail)是一种文本编码格式,通常用于存储证书和密钥,它使用Base64编码将二进制数据转化为可读的ASCII字符。 首先...

    RSA非对称加密算法的PEM与XML格式密钥对的转换

    通过解析XML格式的密钥,提取出公钥的模数(n)和指数(e),然后按照PEM的规范将它们Base64编码并添加适当的行标识。这个过程可能涉及到DOM解析、Base64编码/解码以及字符串操作等技术。 文件"RSAHelper"很可能是一个...

    RSA测试秘钥 PEM+Hex 双格式

    使用OpenSSL工具生成的RSA测试秘钥 PEM+对应的Hex 格式,经过测试有效。

    证书格式转化pfx转化为pem

    1. **PFX(Personal Information Exchange)**:是一种包含私钥、公钥以及根证书或中间证书的文件格式,通常用于保存个人或企业的数字证书。PFX文件采用PKCS#12标准,支持多种加密算法,并且可以被多个应用程序所...

    Window系统使用openssl将pfx转换为pem,key,crt

    PFX 文件是一种个人信息交换格式(Personal Information Exchange),它是一种压缩文件格式,用于存储证书、私钥和证书链信息。PFX 文件通常用于存储 SSL/TLS 证书,并且可以被多种平台和应用程序所支持。 现在,让...

    支持PEM格式的RSA处理方案

    `WNSLP.Toolkits.RSA`可能是一个包含这些功能的工具集,它可能提供了更方便的方法来处理PEM格式的RSA密钥,包括读取文件、序列化和反序列化等操作。 总之,理解RSA算法和PEM格式在C#中的使用是网络安全开发中的重要...

    cacert.pem文件下载

    在本案例中,我们讨论的是名为“cacert.pem”的文件,这是一个包含了多个主要CA根证书的集合,以PEM(Privacy Enhanced Mail)格式编码。 PEM格式是一种常见的证书存储格式,它以Base64编码的方式将证书内容包装在...

Global site tag (gtag.js) - Google Analytics