`
hooray520
  • 浏览: 113977 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

PEM_密钥对生成与读取方法

阅读更多

前言:

 

PEMOpenSSL和许多其他SSL工具的标准格式,OpenSSL 使用PEM 文件格式存储证书和密钥。这种格式被设计用来安全的包含在ascii甚至富文本文档中,如电子邮件。这意味着您可以简单的复制和粘贴pem文件的内容到另一个文档中。

 

PEM文件Base64编码的证书。PEM证书通常用于web服务器,因为他们可以通过一个简单的文本编辑器,很容易地转换成可读的数据。通常当一个PEM编码在文本编辑器中打开文件,它会包含不同的页眉和页脚。

 

-----BEGIN CERTIFICATE REQUEST----- and -----END CERTIFICATEREQUEST-----

 

CSR(证书签名请求)

 

-----BEGIN RSA PRIVATE KEY----- and -----END RSA PRIVATEKEY-----

 

私钥

 

-----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----

 

证书文件

 

 

 

PKCS #8: Private-Key Information Syntax(语法) Standard(标准)

 

OpenSSL:是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

 

OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。

 

一、OpenSSL生成pem格式公私钥

 

1、生成RSA私钥

 

openssl genrsa -out rsa_private_key.pem1024

 

 

 

该命令会生成1024位的私钥,运行,如下图:

 

 

 

 

生成私钥文件rsa_private_key.pem,内容如下:

 

 

用记事本方式打开它,可以看到-----BEGIN RSA PRIVATE KEY-----开头,-----END RSA PRIVATE KEY-----结尾的字符串,这个就是原始的私钥。

 

 

 

备注:

 

         若运行openssl.exe,会进入OpenSSL命令行界面,此时输入命令时,则无需再写openssl。(只是该命令行界面中,暂时无法拷贝,本人太懒,不太喜欢)

 

 

 

2、RSA私钥转换成PKCS8格式

 

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem-outform PEM -nocrypt

 

 

 

可以看到,控制台打印出的内容,-----BEGIN PRIVATE KEY-----开头,-----END PRIVATE KEY-----结尾的字符串,这个就是PKCS#8格式的私钥。

 

 

 

备注:

 

使用该命令,将私钥转成PKCS#8格式,但原rsa_private_key.pem文件中的私钥字符串并没有任何变化。但控制台输出的private key,跟rsa_private_key.pem文件中的private key,不一样。若需使用PKCS8格式的私钥,即控制台中显示的私钥,将其拷贝出来即可。

 

 

 

切记:

 

opensslpkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM nocrypt

 

“-”书写正确,上述nocrypt,因为前面的不是英文的,导致nocrypt失效,所以还需要输入密码。需要输入两次密码,运行,如下图:

 

 

       可以看到,控制台打印出的内容,-----BEGIN ENCRYPTED PRIVATE KEY-----开头,-----END ENCRYPTED PRIVATE KEY-----结尾的字符串,这个就是加了密的PKCS#8格式的私钥。

 

       因为输入了密码,转换后的字符串不一样,会比加了-nocrypt的长一些,所以原来的程序解析不了该私钥字符串,会出错。

 

 

 

3、生成RSA公钥

 

openssl rsa -in rsa_private_key.pem-pubout -out rsa_public_key.pem

 

 

 

运行,如下图:

 

 

 

 

 

生成公钥文件rsa_public_key.pem内容如下:

 

 

         用记事本方式打开它,可以看到-----BEGIN PUBLIC KEY-----开头,-----END PUBLIC KEY-----结尾的字符串,这个就是公钥。

 

 

 

4、Java使用pem文件内容,示例代码

 

1)私钥签名

 

a)获取私钥

 

//获取KeyFactory,指定RSA算法

 

KeyFactorykeyFactory = KeyFactory.getInstance("RSA");

 

//BASE64编码的私钥字符串进行解码

 

BASE64Decoderdecoder = newBASE64Decoder();

 

byte[] encodeByte = decoder.decodeBuffer(priKey);

 

//BASE64解码后的字节数组,构造成PKCS8EncodedKeySpec对象,生成私钥对象

 

PrivateKeyprivatekey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodeByte));

 

        

 

b)使用私钥,对数据进行签名

 

         //获取Signature实例,指定签名算法(本例使用SHA1WithRSA

 

Signaturesignature = Signature.getInstance("SHA1WithRSA");

 

//加载私钥

 

signature.initSign(privatekey);

 

//更新待签名的数据

 

signature.update(plain.getBytes("UTF-8"));

 

//进行签名

 

byte[] signed = signature.sign();

 

//将加密后的字节数组,转换成BASE64编码的字符串,作为最终的签名数据

 

BASE64Encoderencoder = newBASE64Encoder();

 

return encoder.encode(signed);

 

 

 

2)公钥验签

 

a)获取公钥

 

//获取KeyFactory,指定RSA算法

 

KeyFactorykeyFactory = KeyFactory.getInstance("RSA");

 

  //BASE64编码的公钥字符串进行解码

 

BASE64Decoderdecoder = newBASE64Decoder();

 

byte[] encodeByte = decoder.decodeBuffer(pubKey);

 

//BASE64解码后的字节数组,构造成X509EncodedKeySpec对象,生成公钥对象

 

PublicKeypublicKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodeByte));

 

 

 

b)使用公钥,进行验签

 

//获取Signature实例,指定签名算法(与之前一致)

 

Signaturesignature = Signature.getInstance("SHA1WithRSA");

 

//加载公钥

 

signature.initVerify(publicKey);

 

//更新原数据

 

signature.update(plain.getBytes("UTF-8"));

 

//公钥验签(true-验签通过;false-验签失败)

 

BASE64Decoderdecoder = newBASE64Decoder();

 

returnsignature.verify(decoder.decodeBuffer(sign));

 

        

 

备注:验签时,签名数据需要先BASE64解码

 

转载自:https://blog.csdn.net/xiao_zhu_kuai_pao/article/details/45675509

分享到:
评论

相关推荐

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

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

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

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

    linux下从公钥指数(Exponent)和模数(Modulus)得到RSA公钥和pem公钥文件

    OpenSSL提供了丰富的API,如`RSA_generate_key_ex()`函数可以用来生成RSA密钥对,`PEM_write_RSAPublicKey()`和`PEM_write_RSAPrivateKey()`则分别用于将公钥和私钥保存为PEM格式。 以下是使用C语言和OpenSSL库生成...

    OpenSSL工具生成RSA密钥1

    在这个场景中,我们主要关注如何使用 OpenSSL 生成 RSA 密钥对,这是许多网络安全应用的基础,比如 SSL/TLS 加密、数字签名以及 SSH 连接等。 1. **安装 OpenSSL**: 在 Windows 上,你可以通过下载 OpenSSL 的 ...

    C语言实现X509证书解析

    X509是一种标准格式,用于存储公开密钥和相关个人信息。证书通常包含以下几部分:版本信息、序列号、签名算法标识、发行者信息、有效期、主体信息、主体公钥信息以及可选的扩展字段。这些信息以ASN.1(Abstract ...

    Open SSL 常用函数

    - `RSA_generate_key_ex()`:生成RSA公钥和私钥对,用于非对称加密。 - `RSA_public_encrypt()`:使用公钥进行加密。 - `RSA_private_decrypt()`:使用私钥进行解密。 2. **EVP(Encryption/Decryption ...

    ec.rar_DER Format_pem

    标题中的"ec.rar_DER ...开发者可以利用这些源代码来读取、写入或转换证书和密钥,支持在不同的系统和应用程序间进行安全通信。对于理解并操作这些文件,需要对ASN.1、DER编码、PEM格式以及椭圆曲线加密有深入的了解。

    openssl rsa 算法示例源码

    使用`RSA_generate_key()`函数可以生成RSA密钥对,参数包括所需的密钥长度(通常为1024、2048或4096位)、安全的随机数生成器等。生成的密钥可以通过`PEM_write_bio_RSAPublicKey()`和`PEM_write_bio_RSAPrivateKey...

    Alg.rar_3des openssl_OPENSSL 3DES_openssl rsa_openssl测试_openssl测

    在OpenSSL中,可以使用`RSA_generate_key`生成RSA密钥对,包括私钥和公钥。对于RSA运算,如加密和解密,可以调用`RSA_public_encrypt`和`RSA_private_decrypt`函数。同时,OpenSSL还提供了`PEM_write_bio_RSAPrivate...

    Java生成密钥的实例.zip

    在Java中生成密钥并不仅仅是创建密钥对,还需要理解如何正确地使用它们,以及如何在不同场景下选择合适的加密算法。例如,RSA适用于非对称加密,而AES更适合对大量数据进行对称加密。在实际项目中,通常会结合使用这...

    OpenSSL-RSA加解密示例

    1. **生成密钥对**:使用OpenSSL命令行工具`openssl genpkey`或`openssl rsa`生成RSA密钥对。例如,生成一个2048位的密钥对: ``` openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits...

    RSA-使用openSSl加解密编程代码

    生成的密钥对可以存储在`BIO`(I/O抽象)对象中,或者直接写入文件,如client.crt和server.crt这样的证书文件。 `client.crt`和`server.crt`通常是X.509证书,包含RSA公钥以及其他元数据,如证书所有者的身份信息。...

    RSA公私密钥文件生成的代码实现

    RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在...这个代码示例展示了RSA密钥对生成的基本流程,以及如何在Go语言中处理这些密钥,这对于实现基于RSA的加密和解密、签名和验证等功能至关重要。

    openssl库已经编译的文件

    例如,`RSA_generate_key_ex()` 可用于生成一对 RSA 密钥,而 `PEM_read_bio_RSAPrivateKey()` 和 `PEM_read_bio_RSA_PUBKEY()` 则用于从文件读取私钥和公钥。 5. **SSL 连接**:在 C++ 中创建 SSL 连接涉及创建 `...

    Python生成rsa密钥对操作示例

    #### 三、Python实现RSA密钥对生成 ##### 1. 导入必要的库 要使用Python实现RSA加密,首先需要安装`pycryptodome`库,这是一个强大的密码学工具包。可以通过pip安装: ```bash pip install pycryptodome ``` ####...

    platform.pk8和platform.x509.pem以及Signapk工具

    这两个文件是密钥对的一部分,用于对Android系统APK进行签名。"platform.pk8"是私钥文件,包含了用于签名的私钥,而"platform.x509.pem"则是对应的公钥证书。私钥用于对APK进行签名,公钥则用于验证签名,确保APK...

    c# RSA读取密钥文件pfx cer 签名验签加密解密工具类 1 包含java形式密钥转换成c# c# 形式密钥转换成java

    在C#中,`RSACryptoServiceProvider`类的`SignData`方法可以用于生成签名,`VerifyData`方法用于验证签名。 5. **加密和解密**:RSA可以用于对数据进行加密和解密。C#中,`RSACryptoServiceProvider`类提供了`...

    C++基于openssl RSA 实现非对称加密,针对CPU序列号、MAC地址绑定加密

    文件"openssl_key"可能是存放生成的RSA密钥对的文件,可能以PEM或DER格式存储。在C++中,可以使用OpenSSL的`PEM_read_bio_RSA_PUBKEY()`和`PEM_read_bio_RSAPrivateKey()`函数读取这些密钥。 总之,通过结合C++、...

    获取 RSA秘钥 3个方法

    在标签中提到的`openssl`是一个强大的安全套接层(SSL)命令行工具,可用于生成RSA密钥对。在下载并解压`openssl.zip`后,你需要在命令行环境中运行`openssl`。生成RSA密钥对的命令是: ``` openssl genpkey -...

    openssl编程.doc

    OpenSSL提供了生成、读取和操作密钥的API,如PEM_read_bio_PUBKEY、PEM_write_bio_PrivateKey等,方便密钥的存储和交换。 2.4 X.509证书 OpenSSL可以处理X.509证书,包括证书的生成、解析和验证。X509_*系列函数可...

Global site tag (gtag.js) - Google Analytics