直接上代码。。。
char* LoadPemFile(char* pemFilePath,int* length)
FILE* file;
size_t size = 0;
char* buff;
file = fopen(pemFilePath,"rb");
if(file==NULL)
return NULL;
fseek(file,0L,SEEK_END);
size = ftell(file);
buff = (char*)malloc(size);
fseek(file,0L,SEEK_SET);
size = 0;
char line[1024];
while (!feof(file) && !ferror(file))
memset(line,0,sizeof(line));
fgets(line, sizeof(line), file);
int len=strlen(line);
line[len-1]=0;
if(line[0]!='-')
memcpy(buff+size,line,strlen(line));
size += strlen(line);
fclose(file);
*length = size;
return buff;
int base64_decode( const char * base64, unsigned char * bindata )
int i, j;
unsigned char k;
unsigned char temp[4];
const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
for ( i = 0, j = 0; base64[i] != '\0' ; i += 4 )
memset( temp, 0xFF, sizeof(temp) );
for ( k = 0 ; k < 64 ; k ++ )
if ( base64char[k] == base64[i] )
temp[0]= k;
for ( k = 0 ; k < 64 ; k ++ )
if ( base64char[k] == base64[i+1] )
temp[1]= k;
for ( k = 0 ; k < 64 ; k ++ )
if ( base64char[k] == base64[i+2] )
temp[2]= k;
for ( k = 0 ; k < 64 ; k ++ )
if ( base64char[k] == base64[i+3] )
temp[3]= k;
bindata[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2))&0xFC)) |
((unsigned char)((unsigned char)(temp[1]>>4)&0x03));
if ( base64[i+2] == '=' )
break;
bindata[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4))&0xF0)) |
((unsigned char)((unsigned char)(temp[2]>>2)&0x0F));
if ( base64[i+3] == '=' )
break;
bindata[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6))&0xF0)) |
((unsigned char)(temp[3]&0x3F));
return j;
int ParseRsa2048PrivatePemFile(char* pemFilePath,rsa_sk_t *sk)
int length=0;
char* srcData = LoadPemFile(pemFilePath,&length);
if(srcData==NULL)
return -2;
uint8_t destData[1193];
memset(destData,0,sizeof(destData));
length = base64_decode(srcData,destData);
free(srcData);
if(length>=1191)
int startIndex = 0;
if(destData[10]==1)
startIndex = 12;
startIndex = 11;
sk->bits = 2048;
memcpy(&sk->modulus [RSA_MAX_MODULUS_LEN-256 ], destData + startIndex, 256);
startIndex = startIndex + 256 + 2;
memcpy(&sk->public_exponet [RSA_MAX_MODULUS_LEN-3], destData + startIndex, 3);
if(destData[startIndex + 6]==1)
startIndex = startIndex + 8;
startIndex = startIndex + 7;
memcpy(&sk->exponent [RSA_MAX_MODULUS_LEN-256 ], destData + startIndex, 256);
if(destData[startIndex + 259]==1)
startIndex = startIndex + 261;
startIndex = startIndex + 260;
memcpy(&sk->prime1 [RSA_MAX_PRIME_LEN - 128 ], destData + startIndex, 128);
if(destData[startIndex + 131]==1)
startIndex = startIndex + 133;
startIndex = startIndex + 132;
memcpy(&sk->prime2 [RSA_MAX_PRIME_LEN - 128 ], destData + startIndex, 128);
if(destData[startIndex + 131]==1)
startIndex = startIndex + 133;
else if(destData[startIndex + 131]==0)
startIndex = startIndex + 132;
startIndex = startIndex + 131;
memcpy(&sk->prime_exponent1 [RSA_MAX_PRIME_LEN - 128 ], destData + startIndex, 128);
if(destData[startIndex + 131]==1)
startIndex = startIndex + 133;
else if(destData[startIndex + 131]==0)
startIndex = startIndex + 132;
startIndex = startIndex + 131;
memcpy(&sk->prime_exponent2 [RSA_MAX_PRIME_LEN - 128 ], destData + startIndex, 128);
if(destData[startIndex + 131]==1)
startIndex = startIndex + 133;
else if(destData[startIndex + 131]==0)
startIndex = startIndex + 132;
startIndex = startIndex + 131;
memcpy(&sk->coefficient [RSA_MAX_PRIME_LEN - 128 ], destData + startIndex, 128);
return 0;
return -1;
return 0;
C语言解析pem公钥文件在上一篇文章里
直接上代码。。。/*按行读取一个pem文件所有字符并拼接为一整个字符串返回,去除首行、尾行及换行符*/char* LoadPemFile(char* pemFilePath,int* length){ FILE* file; size_t size = 0; char* buff; file = fopen(pemFilePath,"rb"); if(file==NULL) { return NULL; } fseek
不说废话了,直接上代码了。。。
/*按行读取一个pem文件所有字符并拼接为一整个字符串返回,去除首行、尾行及换行符*/
char* LoadPemFile(char* pemFilePath,int* length)
FILE* file;
size_t size = 0;
char* buff;
file = fopen(pemFilePath,"rb");
if(file==NULL)
return NULL;
在公钥密码学(也称为非对称密码术)中,加密机制依赖于两个相关的密钥,一个公钥和一个私钥。公钥用于加密消息,而只有私钥的所有者才能解密消息。
在本教程中,我们将了解如何从 PEM 文件中读取公钥和私钥。
首先,我们将研究有关公钥密码学的一些重要概念。然后,我们将学习如何使用纯 Java 读取 PEM 文件。
最后,我们将探索BouncyCastle库作为替代方法。
2. 概念
在开始之前,让我们先了解一些关键概念。
X.509 是定义公钥证书格式的标准。因此,这种...
最近有个项目需要用到rsa加密和解密,平台是cortex-m4单片机,于是我想用炒的比较火的mbedtls库实现。既然这玩意炒的比较火,资料应该不少才对,上手以后才发现资料少的可怜,仅有的资料基本都是在注水,参考意义不大,pem格式的秘钥操作这一块基本相当于没有资料,只能自己硬着头皮搞了。搞了两天以后终于搞出来了。
关于pem相关知识这里不做介绍,我就直接贴代码。
#if !defined(...
pem:轻松解析PEM文件
pem是许可的Python模块,用于解析和拆分,即Base64编码的DER密钥和证书。
它在Python 2.7和3.5+上运行,没有依赖关系,并且不会尝试以任何方式解释证书数据。
它源于从各种证书部署中加载密钥,证书,信任链和DH参数的需要:某些服务器(如 )希望它们是一个单独的文件,其他服务器(如 )希望它们与服务器证书串联在一起,最后一些(例如 )期望密钥,证书和链位于一个文件中。 使用pem ,您的Python应用程序可以应对所有这些情况:
>>> import pem
>>> certs = pem.parse_file( " chain.pem " )
>>> certs
[<Certificate>, <Certificate(PEM string with SHA-1
PKCS#8格式使用的是ASN.1结构,首先我们对一个没有执行加密的PKCS#8格式私钥文件进行一下解析,方便我们下面分析其结构。
命令:openssl asn1parse -i -in privatekey.pem
结果如下:
[html] view plaincopy
0:d=0 hl=4 l=1213 cons: SEQUENCE
4:d=1 hl=2 l= 1 prim: INTEGER ...
版权声明:本文根据DragonKing牛,E-Mail:wzhah@263.NET发布在https://openssl.126.com的系列文章整理修改而成(这个网站已经不能访问了),我自己所做的工作主要是针对新的1.0.2版本进行验证,修改错别字,和错误,重新排版,以及整理分类,配图。 未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!
1 PEM编码文件结构介绍
PEM全称是Privacy Enhanced Mail,该标准定义了加密一个准备要发
using System.Security.Cryptography;
using System.Xml;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
class Program
static void Main(string[] args)
string publicKeyPath = "public_key.pem";
string privateKeyPath = "private_key.pem";
// Read public key
AsymmetricKeyParameter publicKeyParam;
using (var reader = File.OpenText(publicKeyPath))
publicKeyParam = (AsymmetricKeyParameter)new PemReader(reader).ReadObject();
// Convert public key to XML format
var rsa = (RSA)RSA.Create();
rsa.ImportParameters(DotNetUtilities.ToRSAParameters((RsaKeyParameters)publicKeyParam));
var publicKeyXml = rsa.ToXmlString(false);
// Read private key
AsymmetricCipherKeyPair keyPair;
using (var reader = File.OpenText(privateKeyPath))
keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();
// Convert private key to XML format
rsa = (RSA)RSA.Create();
rsa.ImportParameters(DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)keyPair.Private));
var privateKeyXml = rsa.ToXmlString(true);
// Print public and private keys in XML format
Console.WriteLine("Public key in XML format:");
Console.WriteLine(publicKeyXml);
Console.WriteLine();
Console.WriteLine("Private key in XML format:");
Console.WriteLine(privateKeyXml);
注意:BouncyCastle 库需要通过 NuGet 安装。
CSDN-Ada助手: