c语言pem文件用什么打开,c – 从PEM编码的私钥加载RSA私钥
关键是PEM编码.您需要剥离PEM页眉和页脚,然后从Base64转换回DER / BER,最后使用Crypto的BERDecodePrivateKey.
在Keys and Formats下的Crypto wiki上有一些关于这个主题的阅读.下面是执行转换的代码(我不相信Stack Overflow在Crypto中有一个工作示例).
string RSA_PRIV_KEY =
"-----BEGIN RSA PRIVATE KEY-----\n"
"MIIBOgIBAAJBAK8Q+ToR4tWGshaKYRHKJ3ZmMUF6jjwCS/u1A8v1tFbQiVpBlxYB\n"
"paNcT2ENEXBGdmWqr8VwSl0NBIKyq4p0rhsCAQMCQHS1+3wL7I5ZzA8G62Exb6RE\n"
"INZRtCgBh/0jV91OeDnfQUc07SE6vs31J8m7qw/rxeB3E9h6oGi9IVRebVO+9zsC\n"
"IQDWb//KAzrSOo0P0yktnY57UF9Q3Y26rulWI6LqpsxZDwIhAND/cmlg7rUz34Pf\n"
"SmM61lJEmMEjKp8RB/xgghzmCeI1AiEAjvVVMVd8jCcItTdwyRO0UjWU4JOz0cnw\n"
"5BfB8cSIO18CIQCLVPbw60nOIpUClNxCJzmMLbsrbMcUtgVS6wFomVvsIwIhAK+A\n"
"YqT6WwsMW2On5l9di+RPzhDT1QdGyTI5eFNS+GxY\n"
"-----END RSA PRIVATE KEY-----";
static string HEADER = "-----BEGIN RSA PRIVATE KEY-----";
static string FOOTER = "-----END RSA PRIVATE KEY-----";
size_t pos1,pos2;
pos1 = RSA_PRIV_KEY.find(HEADER);
if(pos1 == string::npos)
throw runtime_error("PEM header not found");
pos2 = RSA_PRIV_KEY.find(FOOTER,pos1+1);
if(pos2 == string::npos)
throw runtime_error("PEM footer not found");
// Start position and length
pos1 = pos1 + HEADER.length();
pos2 = pos2 - pos1;
string keystr = RSA_PRIV_KEY.substr(pos1,pos2);
// Base64 decode,place in a ByteQueue
ByteQueue queue;
Base64Decoder decoder;
decoder.Attach(new Redirector(queue));
decoder.Put((const byte*)keystr.data(),keystr.length());
decoder.MessageEnd();
// Write to file for inspection
FileSink fs("decoded-key.der");
queue.CopyTo(fs);
fs.MessageEnd();
try
{
CryptoPP::RSA::PrivateKey rsaPrivate;
rsaPrivate.BERDecodePrivateKey(queue,false /*paramsPresent*/,queue.MaxRetrievable());
// BERDecodePrivateKey is a void function. Here's the only check
// we have regarding the DER bytes consumed.
ASSERT(queue.IsEmpty());
}
catch (const Exception& ex)
{
cerr << ex.what() << endl;
exit (1);
}
加载密钥后,您可以使用以下命令对其进行验证:
AutoSeededRandomPool prng;
bool valid = rsaPrivate.Validate(prng,3);
if(!valid)
cerr << "RSA private key is not valid" << endl;
并打印出来:
cout << "N: " << rsaPrivate.GetModulus() << endl << endl;
cout << "E: " << rsaPrivate.GetPublicExponent() << endl << endl;
cout << "D: " << rsaPrivate.GetPrivateExponent() << endl << endl;
如果密钥受密码保护,则Crypto无法对其进行解码.该库缺乏执行解密的支持.在这种情况下,您可以使用以下OpenSSL命令将其转换为BER / DER.然后你可以使用加密密钥材料.
openssl pkcs8 -nocrypt -in rsa-key.pem -inform PEM -topk8 -outform DER -out rsa-key.der
示例程序使用以下方法将密钥写入文件:
FileSink fs("decoded-key.der");
queue.CopyTo(fs);
fs.MessageEnd();
CopyTo将队列中的字节留待以后使用.您可以使用ASN.1工具转储文件,例如Gutmann的dumpasn1:
$dumpasn1 decoded-key.der
0 314: SEQUENCE {
4 1: INTEGER 0
7 65: INTEGER
: 00 AF 10 F9 3A 11 E2 D5 86 B2 16 8A 61 11 CA 27
: 76 66 31 41 7A 8E 3C 02 4B FB B5 03 CB F5 B4 56
: D0 89 5A 41 97 16 01 A5 A3 5C 4F 61 0D 11 70 46
: 76 65 AA AF C5 70 4A 5D 0D 04 82 B2 AB 8A 74 AE
: 1B
74 1: INTEGER 3
77 64: INTEGER
: 74 B5 FB 7C 0B EC 8E 59 CC 0F 06 EB 61 31 6F A4
: 44 20 D6 51 B4 28 01 87 FD 23 57 DD 4E 78 39 DF
: 41 47 34 ED 21 3A BE CD F5 27 C9 BB AB 0F EB C5
: E0 77 13 D8 7A A0 68 BD 21 54 5E 6D 53 BE F7 3B
143 33: INTEGER
: 00 D6 6F FF CA 03 3A D2 3A 8D 0F D3 29 2D 9D 8E
: 7B 50 5F 50 DD 8D BA AE E9 56 23 A2 EA A6 CC 59
: 0F
178 33: INTEGER
: 00 D0 FF 72 69 60 EE B5 33 DF 83 DF 4A 63 3A D6
: 52 44 98 C1 23 2A 9F 11 07 FC 60 82 1C E6 09 E2
: 35
213 33: INTEGER
: 00 8E F5 55 31 57 7C 8C 27 08 B5 37 70 C9 13 B4
: 52 35 94 E0 93 B3 D1 C9 F0 E4 17 C1 F1 C4 88 3B
: 5F
248 33: INTEGER
: 00 8B 54 F6 F0 EB 49 CE 22 95 02 94 DC 42 27 39
: 8C 2D BB 2B 6C C7 14 B6 05 52 EB 01 68 99 5B EC
: 23
283 33: INTEGER
: 00 AF 80 62 A4 FA 5B 0B 0C 5B 63 A7 E6 5F 5D 8B
: E4 4F CE 10 D3 D5 07 46 C9 32 39 78 53 52 F8 6C
: 58
: }
0 warnings,0 errors.
c语言pem文件用什么打开,c – 从PEM编码的私钥加载RSA私钥相关推荐
- VB 文件未找到: 'C:\WINDOWS\system32\ieframe.dll\1'--继续加载工程吗?
引用:http://blog.sina.com.cn/s/blog_5542b9c90100xsm8.html 文件未找到: 'C:\WINDOWS\system32\ieframe.dll\1'-- ...
- 打开Visual Studio 2010,左下角显示加载工具箱内容
打开Visual Studio 2010,左下角显示加载工具箱内容 不知何时起,每次打开Visual Studio2010时在左下角显示加载工具箱内容,这个过程简直就是煎熬. 于是开始在网上查找解决办 ...
- CV:利用cv2(加载人脸识别xml文件及detectMultiScale函数得到人脸列表)+keras的load_model(加载表情hdf5、性别hdf5)并标注
CV:利用cv2+自定义load_detection_model(加载人脸识别xml文件及detectMultiScale函数得到人脸列表)+keras的load_model(加载表情hdf5.性别h ...
- webpack:多文件、多环境、跨域处理、热加载
文章目录 webpack:多文件.多环境.跨域处理.热加载 多页面处理 webpack多环境 vuecli多环境配置 配置不同的打包命令 定义变量 跨域 通过node模拟接口 通过webpack解决跨 ...
- html引用单文件组件,webpack入坑之旅(五)加载vue单文件组件_html/css_WEB-ITnose
需要什么? 在经过前面的四个练习,相信已经对于 webapck有了一定的了解,现在我们就来一个综合案例,进一步甲申年对于 webpack的理解. 首先我们应该思考要解析 .vue类型的文件,需要什么样 ...
- win7总是显示加载计算机,win7系统打开“此电脑”很慢总是在加载不显示的具体办法...
win7系统使用久了,好多网友反馈说win7系统打开"此电脑"很慢总是在加载不显示的问题,非常不方便.有什么办法可以永久解决win7系统打开"此电脑"很慢总是在 ...
- 计算机管理器自动弹出,win7打开IE浏览器自动弹出管理加载项窗口解决方法
win7系统电脑自带IE浏览器,最近有位用户遇到一件很奇怪的事情,只要一打开IE浏览器就会弹出"管理加载项"窗口.Win7/win8系统都有这样的情况出现,非常烦人,每次都要手动关 ...
- 网页无法打开, 位于 https://xxx 的网页无法加载,因为:net::ERR_NAME_NOT_RESOLVED
HarmonyOS 开发Webview调用URL一直提示: 网页无法打开, 位于 https://xxx 的网页无法加载,因为:net::ERR_NAME_NOT_RESOLVED 经过多次测试发现, ...
- 打开Windows Powershell时出现 :. : 无法加载文件C:\user\...\profile.ps1。未对文件profile.ps1进行数字签名。无法在当前系统上运行该脚本 的解决办法
想使用Windows Powershell命令时,打开后出现如下报错: . : 无法加载文件 C:\Users\arxc\Documents\WindowsPowerShell\profile.ps1 ...
最新文章
- 图片加载完成再执行事件
- python心得体会-终于懂得python基础学习心得
- 继承 抽象 接口 多态
- 一个路由再接另一个路由,让和别人合拉的一个网线可以多台电脑一起使用
- 在Marketplace上销售应用【WP7学习札记之十八】
- python撩妹代码_Python十行代码让你秒变撩妹达人!想学?
- ApacheCN × FlyAI 人工智能比赛活动
- Java集合Collection之遍历方法总结(List、Map、Set)
- nmn抗衰老是骗局吗,美国nmn骗局,正面解答
- hackthebox - jail (考点:linux缓冲区 nfs配置提权 rvim提权 rar解密 rsa解密)
- phyton题库+解析
- CSS 特殊性(Specificity)
- BLE学习笔记3:GAP初始化
- 怎么把录音导入库乐队_库乐队导入音乐的具体流程讲述
- 2021年煤矿井下爆破考试内容及煤矿井下爆破考试资料
- 74HC595控制8位数码管 计时程序
- 英语口语学习(13-14)
- 赛尔号什么时候支持html5,赛尔号:最初的5只年费精灵,总被云玩家吊打,其实他们很强...
- 中国企业不给加拿大授权,加拿大运营商就不能用5G专利?纯属扯谈
- 电子招标采购系统源码 项目说明 开发类型
热门文章
- STC8H开发(九): STC8H8K64U模拟USB HID外设
- R语言平均值和加权平均值
- Kafka史上最详细原理总结(一)
- 了解知识 ,预防意外,有备无患!
- pytorch实现resnet50(训练+测试+模型转换)
- c#产生随机字符串的两种方法
- 数据结构——优先级队列(堆)
- 从阿里达摩院十大科技趋势预测,看认知智能发展 道翰天琼
- Linux软件安装和卸载(rpm与yum)
- java.lang.ClassNotFoundException: Cannot find class: com.***.****.***.***.NewStudentDto